C++面经汇总之C++基础(二)

11、new/delete与malloc/free的区别

(1)malloc 与 free是C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请动态内存和释放内存。

(2)malloc只会开一块内存,不会调用对象的构造函数,free 只会释放内存,不会调用对象的析构函数;但new和delete不一样,new先调用malloc开辟内存,再调用对象的析构函数,delete先调用对象的析构函数,再释放内存(注意顺序)。

​ 对于非内部数据类型的对象而言(简单理解为创建一个对象,而不是创建对象内部的变量),光用 malloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符delete。注意 new/delete 不是库函数。

【一句话:malloc是库函数,new是运算符;new会调用构造函数,异常时new会抛出异常,malloc不会抛出,只会返回空指针】

12、C++和C的区别

• C是面向过程的语言,而C++是面向对象的语言。

• C和C++动态管理内存的方法不一样,C是使用malloc/free函数,而C++除此之外还有new/delete关键字。

• C中的struct和C++的类,C++的类是C所没有的,但是C中的struct是可以在C++中正常使用的,并且C++对struct进行了进一步的扩展,使struct在C++中可以和class一样当做类使用,而唯一和class不同的地方在于struct的成员默认访问修饰符是public,而class默认的是private;

• C++支持函数重载,而C不支持函数重载。

• C++中有引用,而C没有;

• C++全部变量的默认链接属性是外链接,而C是内连接;

• C 中用const修饰的变量不可以用在定义数组时的大小,但是C++用const修饰的变量可以

【一句话:面向对象、内存管理、函数重载、引用】

13、C++ 11 有哪些新特性

auto关键字:编译器可以根据初始值自动推导出类型。但是不能用于函数传参以及数组类型的推导

nullptr关键字:nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型;而NULL一般被宏定义为0,在遇到重载时可能会出现问题。

智能指针:C++11新增了std::shared_ptr、std::weak_ptr等类型的智能指针,用于解决内存管理的问题。

右值引用:基于右值引用可以实现移动语义和完美转发,消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率

初始化列表:使用初始化列表来对类进行初始化

【一句话:nullptr、右值引用、智能指针、auto】

14、面向对象的三大特性

(1)封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据(成员变量)和方法(成员函数)只让可信的类或者对象操作, 对不可信的进行信息隐藏。

(2)继承:指可以让某个类型的对象获得另一个类型的对象的属性的方法。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

(3)多态:是指一个类实例的相同方法(相同的成员函数)在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。C++多态基于虚函数和虚继承实现。

15、深拷贝和浅拷贝

浅拷贝: 1、只是拷贝了基本类型的数据,而引用类型数据,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

2、两个指针指向同一块内存,任何一方的变动都会影响到另一方;两个指针指向同一块内存,被析构2次,即delete同一块内存2次,造成程序崩溃。

3、对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数,调用一次构造函数,调用两次析构函数,两个对象的指针成员所指内存相同,但是程序结束时该内存却被释放了两次,会造成内存泄漏问题。

深拷贝:1、在对含有指针成员的对象进行拷贝时,必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间,即进行深拷贝,这样就避免了内存泄漏发生,调用一次构造函数,一次自定义拷贝构造函数,两次析构函数。两个对象的指针成员所指内存不同。

2、 不仅对象中的数据成员进行了赋值,同时还为动态成员开辟了新的空间。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值