【C++】004、C与C++的最核心的区别

一、C与C++最核心的区别在于设计哲学不同

  • C语言的设计:是面相过程的编程思想,是手动挡的底层工具,他信任程序员的每一个操作。

  • C++语言设计:相当于自动挡+手动拨片,追求零开销抽象(面向对象编程),通过RAII机制把资源管理交给对象的生命周期。

二、三大核心区别

1)、编程范式(思维模式的不同)

C:是过程式+结构化

  • 数据(struct封装)和操作(函数)是分离的,要操作数据,必须把数据指针传给函数。

  • struct结构体,他不是类,内部只有属性,没有方法,要给struct的对象的属性进行赋值,必须在外部的函数中,将该对象指针作为参数传递,在函数中进行对象属性值的赋值。

C++:多范式

  • C++支持面向对象(封装、继承、多态),泛型编程,,函数式(lambda)。数据和方法绑定在一起,通过类来构建高内聚的模块。

2)、内存和资源管理不同(最本质的工程落地区别)

C的做法:依赖程序员手动处理

  • 使用malloc、calloc来分配原始内存,用free来释放内存,完全依赖程序员手动配对,一旦忘记free就是内存泄漏

C++做法:引入RAII机制

  • C++通过RAII机制实现资源获取初始化,new会调用构造函数,delete会调用析构函数。

  • 最关键的是,栈对象在离开作用域时会自动调用析构函数释放资源。(如智能指针,容器vector)

3)、抽象能力的实现层级(编译与运行时)

C的抽象:函数指针与void*

  • C语言只能通过函数指针与void*来实现抽象,类型检查较弱,多态需要运行时传参,有一定开销且不直观。

C++抽象:模板编程,虚函数

  • C++通过模板编程实现多态,在编译期生成代码,无运行时开销,也就是零开销抽象。

  • 虚函数:通过虚表实现动态绑定,是运行时多态

  • 这种抽象能力让C++既能写操作系统内核,又能写高层业务逻辑。

C++把释放资源这件事从程序员手动记忆,变成了对象的生命周期自动管理,这是工程上防内存泄漏的根本性进步。

三、底层与编译层面的区别

1)、符号修饰与extern "C"

  • C++支持函数重载,编译器会对函数名重整

  • C编译器不会重整符号名

  • 这就是为什么C++调用C语言时,要用extern "C"来修饰。

2)类型安全差异

  • C语言中,void*可以隐式转换为任何指针类型。

  • C++中,void*不能隐式转换,必须强制类型转换

四、C++不是C的超集

  • C有restrict关键字,可以告诉编译器指针没有别名以便优化

  • C++没有