关于C和C++的区别是面试中经常会被问到的问题,本着即将面试的心态,进行知识整理,并对小知识点进行扩展;
C/C++的联系:
- C++是C的超集,兼容大部分C的语法的结构;
- 联系嘛我只能想到这个,毕竟cplusplus嘛!
C/C++区别:
- 第一点就应该想到C是面向过程的语言,而C++是面向对象的语言,一般简历上第一条都是熟悉C/C++基本语法,了解C++面向对象思想,那么,请问什么是面向对象?
- C和C++动态管理内存的方法不一样,C是使用malloc/free函数,而C++除此之外还有new/delete关键字;(关于malooc/free与new/delete的不同又可以说一大堆,最后的扩展_1部分列出十大区别);
- 接下来就不得不谈到C中的struct和C++的类,C++的类是C所没有的,但是C中的struct是可以在C++中正常使用的,并且C++对struct进行了进一步的扩展,使struct在C++中可以和class一样当做类使用,而唯一和class不同的地方在于struct的成员默认访问修饰符是public,而class默认的是private;
- C++支持函数重载,而C不支持函数重载,而C++支持重载的依仗就在于C++的名字修饰与C不同,例如在C++中函数int fun(int ,int)经过名字修饰之后变为 _fun_int_int ,而C是
- _fun,一般是这样的,所以C++才会支持不同的参数调用不同的函数;
- C++中有引用,而C没有;这样就不得不提一下引用和指针的区别(文后扩展_2);
- 当然还有C++全部变量的默认链接属性是外链接,而C是内连接;
- C 中用const修饰的变量不可以用在定义数组时的大小,但是C++用const修饰的变量可以(如果不进行&,解引用的操作的话,是存放在符号表的,不开辟内存);
- 当然还有局部变量的声明规则不同,多态,C++特有输入输出流之类的,很多,下面就不再列出来了; “`
小知识点补充扩展
- 扩展_1: 细数malloc/free和new/delete的十点区别
- malloc是从堆上开辟空间,而new是从自由存储区开辟;(自由存储区是
- C++抽象出来的概念,不仅可以是堆,还可以是静态存储区);
- malloc/free是函数,而new/delete是关键字;
- malloc对开辟的空间大小需要严格指定,而new只需要对象名;
- malloc开辟的空间即可以给单个对象用也可以给数组用,释放的方式都是
free();而new开辟对象数组用的是new[size] ,释放的的时候是 delete[]
(尽管内置类型可能不会引起问题,但是自定义类型的话,delete[]需要知道有
多少个对象,而这个计数就被放在这块空间的头部);
- 返回值问题,malloc开辟成功返回void*,需要强转,失败返回NULL,new
成功返回对象指针,失败抛出异常(这就可能会提到C++的new_handler机
制),虽然为了最大程度的兼容C,C++的new也支持失败返回NULL,但是一般不
被使用,大家可以了解一下;
- 是否调用构造和析构,这点应该放在前面,new和free不但负责开辟空间,
还会调用对象的构造函数和析构函数;最好了解一下new的三种表达形式(new运
算符,operator new(); placement new();)还有定位new表达式的
使用;
- 是否可以相互调用,new的实现可以用malloc,malloc的实现不可以使用
new;
- 是否可以被重载,我们可以重载自己的operator new/delete,但是不可
以重载new/delete/malloc/free;
- malloc开辟 的内存如果太小,想要换一块大一点的,可以调用relloc实
现,但是new没有直观的方法来改变;
- 第十点其实前面已经提到,当new中的底层实现如果获取不到更多的内存,
会触发new_handler机制,留有一个set_new_handler句柄,看看用户是否设
置了这个句柄,如果设置了就去执行,句柄的目的是看看能不能尝试着从操作系
统释放点内存,找点内存,如果实在不行就抛出bad_alloc异常;而malloc就
没有这种尝试了;——-
如果大家对C/C++感兴趣的话,可以加一下我们的学习交流Q群:637 935 295,免费领取一套学习资料和视频课程哟~
- 扩展_2 指针和引用的区别
- 1.指针有自己的一块空间,而引用只是一个别名;
- 2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
- 3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象
- 的引用;
- 4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引
- 用的修改都会改变引用所指向的对象;
- 5.可以有const指针,但是没有const引用;
- 6.指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能
- 被改变;
- 7.指针可以有多级指针(**p),而引用至于一级;
- 8.指针和引用使用++运算符的意义不一样;