区别:
- c语言: 面向过程的语言,c++:面向对象的语言
- .二者动态管理内存的方法不一样:c语言:使用malloc/free函数,c++除此之外还有new/delete关键字(知识点1:new和malloc的区别)
- 关于重载:c语言不支持重载,但是c++支持函数重载。c++支持重载的原因在于c++的名字修饰和c不同,例如在c++中 int fun(int,int)函数的形式就是 _fun_int_int ,但是在C语言中是_fun,二者是不一样的,所以在C++中不同的参数可以调用不同的函数。(知识点2:函数重载)
- C中的struct和c++中的类: C++中的类是C所没有的,但是C中的struct是可以正常在C++中运行使用的,并且C++对struct进行了进一步的扩展,使得struct在C++中可以和class一样当做类使用,而唯一和class不同的地方在于struct的成员默认访问修饰符是public,而class默认的访问修饰符是private。
- C++中有引用,C语言中没有(知识点3:引用和指针的区别)
- c++中全部变量的默认链接属性是外链接,而C语言是内连接(知识点4:内外链接之分)
- C中用const修饰的变量不可以用来定义数组的大小,但是C++中用const修饰的变量可以(如果不进行&解引用的操作的话,是存放在符号表的,不用开辟内存)
知识点扩充:
知识点1: malloc/free 和 new/delete 的十点区别
- malloc是在堆上开辟空间,new是从自由存储区开辟:(自由存储区是c++抽象出来的概念,不仅是堆,也可是静态存储区)
- malloc/free是函数,返回的函数类型是:void* malloc(size_t size)/ void free(void * ptr),new/delete 是关键字;
- malloc需要对开辟的空间大小进行严格指定,但是new不用,只需要对象名;
- malloc开辟的空间可以给一个对象用也可以给数组用,释放的方式都是free();而new开辟对象数组用的都是new[size],释放的时候是delete[](内置类型可能不会引起问题,但是自定义类型的话,delete[]需要知道有多少个对象,而这个计数就放在这片空间的头部);
- 返回值问题:malloc开辟成功后返回的是 void*,需要强转,失败返回NULL;new成功后返回对象指针,失败抛出异常(这里可能会提到C++的new_handler机制)
- 是否使用构造和析构函数,new和free不但负责开辟空间,还会调用对象的析构函数和构造函数; new的三种表达方式(new运算符,operator new();placement new();)还有定位new表达式的使用;
- 是否可以相互调用,new的实现可以用malloc,malloc的实现不可以使用new;
- 是否可以被重载,我们可以重载自己的 operator new/ delete,但是不可以重载 new/delete/malloc/free;
- malloc开辟的内存如果太小,想要换一块大的,可以调用realloc实现,但是new没有直观的方法来改变。
- 当new中的底层实现如果获取不到更多的内容,会触发new_handler机制,留有一个set_new_handler句柄,看看用户是否甚至有这个句柄,如果设置了就去执行,句柄的目的是看看能不能从操作系统中释放点内存,找点内存,如果实在不行就抛出bad_alloc异常;而malloc就没有这种尝试了。
知识点而二:函数重载
什么是函数重载:在一个作用域里面,如果有多个函数的名字相同,但是参数列表不相同(形参的个数和类型不同),返回值类型可以相同,也可以不相同,我们将这样的函数称为函数重载。
函数组成: 1.函数名 2.返回值 3.参数类型 :(1)个数 (2)类型(3)顺序
函数重载三要素:(1)同名 (2)不同参 (3)同作用域
注意点: int sum(int a,int b){}
double sum(int a,int b){}
主函数中 int main(){ sum(10,20)} 此时我们可以看到主函数调用sum函数,但是在此处我们只能看到函数名和形参类型,我们无法看到调用的函数什么返回类型,到底是int还是double,所以需要注意的是 函数名是无法给函数重载做支持的。
知识点三: const
C中:常变量 编译阶段 检查有没有做左值,其他和常量一样
C++中: 变量 编译阶段 把用到常量的地方都替换成常量初始化的值
一定要初始化
知识点四:引用
引用是内存单元的别名。例如我们将猫可以又叫咪咪。咪咪就是猫的别名 。int a; int *b=&a; 此时b 就是内存单元 a的另一个名字。
1.为什么引用一定要初始化呢? 因为引用是内存单元的别名,只有当内存单元本身真实存在的时候,才能起别名啊。
2.引用不能被引用,不能取地址的数据。例如: int &b=a;
3.引用只能引用 引用变量 所引用的数据
4.引用不能被修改,例如我们不可以将猫叫咪咪的同时,又将狗叫做咪咪。(这个比喻有点可爱)
知识点五:引用和指针的区别
1.指针有自己的一个空间,而引用只是一个别名;
2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
3.指针可以初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用
4. 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改就会改变引用所指向的对象。
5.可以有const指针,但是没有const引用;
6. 指针在使用中可以指向其他对象,但是引用只能是一个对象的引用,不能被改变;
7.指针有多级指针(**p),而引用只有一级;
8.指针和引用使用++运算符的意义不一样;