一、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++没有