NULL宏定义的区别:
C语言中的NULL的宏定义是(void*)0,而C++中NULL的宏定义是0。
这也认证了C语言中的指针类型是可以进行隐式转换的,而C++中相比较就有着严格的类型检查,不允许void*类型的指针进行强制类型转换,因此只能进行强制转换
//C语言
void *p;
int *p1=p; //可以进行隐式转换
//C++
void *p;
int *p1=(int *)p; //不能隐式转换,只能强制转换
由于NULL在C++中具有二义性,既可以代表空也可以代表0 , 这就会引出发生在函数重载的问题
为了解决这个问题,C++11引出的新特性nullptr,解决了这个痛处
void fun(char *p){
cout<<"调用指针参数的函数"<<endl;
}
void fun(int a){
cout<<"调用整数参数的函数"<<endl;
}
int main(){
fun(NULL); //具有二义性(整数0,指针的空),编译器不知道调用哪一个
fun(nullptr); //使用nullptr可以明确知道调用的是传参为指针类型的函数
return 0;
}
//输出
调用指针参数的函数
头文件的区别
C语言的文件带.h 例如:#include<stdio.h>
C++中的文件不需要带.h 例如:#include<iostream>
面向的区别
C语言是属于面向过程编程的
C++是属于面向对象编程的,三大特性分别是封装,继承,多态
封装: 将一个事物的属性(成员变量)与行为(成员函数)封装成一个类,并加以权限public,protected,private等三种去加以保护成员变量或成员函数,数据更安全
继承:将已有类进行扩展,也就是子类(派生类)去继承父类(基类),子类(派生类)具有父类(基类)的一切行为与属性,除了特意封装保护的数据,提高了代码的可拓展性
多态:首先必须存在继承关系,其次是父类的指针或引用指向子类的对象,子类需要重写父类的函数并且进行调用后,使得一个事物的不同对象有不同的表现。
变量的区别
C++拥有C语言未曾拥有的布尔变量(bool), bool变量会把非零的数变成true,把0变成false,经常用作函数的返回值或者是否判断是否经过某段代码(冒泡排序中的排序算法优化)
函数重载的区别
C语言中没有函数重载,而C++中有函数重载。
具体原因是因为编译器的命名方式不同。
C语言时编译器给函数命名时只是函数的名字
C++时编辑器给函数命名时不仅是函数的名字而且还带上参数,参数名和函数名之间用_分隔