C++面试题

https://www.cnblogs.com/inception6-lxc/p/8686156.html
1.虚析构函数
为什么析构函数要虚函数?如果定义了一个基类指针,该指针指向一个实例化的派生类,如果delet该基类指针,会调用基类的析构函数,而不会调用派生类的析构函数,导致内存无法释放,造成内存泄漏。
解决办法是将基类的析构函数构造成虚函数,会实现动态绑定,所有继承他的派生类的析构函数就算不同名,也是虚析构函数,动态绑定可以执行所有析构函数。
https://www.cnblogs.com/smiler/p/3872381.html

2.reserve和capacity区别
vector vec;vec.reserve(100).这样会给vec100的空间,此时size为0,size()返回的是里面的元素数,而capacity返回100,返回的是该容器可存放的元素个数。

3.const和static
const不可修改,const char *p内容不可修改,char *const p地址不可修改。
static类内变量,只能在类外初始化int a::var=10;因为static变量属于整个类,而不属于某个对象,不过也可以const static在类内初始化。

4.多态
静态多态和动态多态,静态多态是函数重载(允许同名函数,但参数列表类型不同)在编译时就决定了函数地址,动态多态是虚函数,定义一个基类指针,通过指向不同的子类调用不同子类的方法。

5.虚函数表
多态由虚函数表实现,对象实例地址最前面是虚指针指向虚函数表。
每个实例化的对象(多继承则有多个虚指针)都包含一个虚指针,虚指针指向一个虚函数表,如果不是多态,则虚函数表是基类+当前类的方法;如果是多态,则当前类的会替代重名的基类的方法。
在这里插入图片描述

6.new malloc()区别
new是运算符,malloc()是函数
new调用构造函数,malloc不会
new自动分配地址空间,malloc不会
new可重载,malloc不会

7.delete和free比较

(1).delete能自动调用对象的析构函数,free不会;
(2).delete是C++运算符,free是C标准库函数。

8.C++内存分布
堆:用户自己申请
栈:系统自动申请
静态存储区:静态全局变量
字符串常量:字符串
代码区:程序二进制、

9.浅拷贝和深拷贝
浅拷贝例如默认的拷贝构造函数,student s2(s1),s1 s2指向一个地址空间,浅拷贝就是只复制指针。
深拷贝自己构造一个拷贝构造函数,如果是深拷贝的话,s1 s2指向两个地址空间,也就是除了复制指针,还复制了指针所指的地址空间。

10.悬空指针和野指针
悬空指针只free了,但没指向null,就是悬空指针
野指针指的是没有初始化的指针。

11.struct和class区别
struct默认public,class默认private

12.C++类成员初始化顺序
基类静态和全局变量
派生类静态和全局
基类成员
派生类成员

13.Vector扩容原理
vector是连续的,如果没有连续空间时,还push_back,则会把原来数据复制到一个更大的内存空间,再释放之前的,再插入新的元素。

14.成员函数内static和const不能同时修饰
因为const为防止改变会隐式的增加一个this,而static是属于类的,没有this。

15.常量指针和指针常量
const int *p和int *const p
常量指针:
不能通过该指针修改内容,可以修改该指针指向的地址,可通过原声明修改地址内容。
指针常量:
不能修改指针的地址,但可以修改指针指向的内容。

16.默认函数
(1).构造函数
(2)析构函数
(3)拷贝构造函数:浅拷贝
(4)重载赋值运算符:a,b使得a的参数赋值给b
(5)重载取址运算(const)符:return this
(6)重载移动构造函数:a给b,a析构。
(7)重载移动赋值操作符函数:右是引用的

class A
{
public:

    // 默认构造函数;
    A();

    // 默认拷贝构造函数
    A(const A&);

    // 默认析构函数
    ~A();

    // 默认重载赋值运算符函数
    A& operator = (const A&);

    // 默认重载取址运算符函数
    A* operator & ();

    // 默认重载取址运算符const函数
    const A* operator & () const;

    // 默认移动构造函数
    A(A&&);

    // 默认重载移动赋值操作符
    A& operator = (const A&&);

};

17.构造函数为什么不能是虚函数?
因为创建对象时要知道准确的类型,而虚函数还要访问虚函数表。

18.为什么不能所有函数都是虚函数?
因为虚函数要维护虚函数表,有系统开销没必要。

19.重载和覆盖的区别?
虚函数是基类希望派生类重新定义的函数,派生类重新定义基类虚函数叫覆盖。
重载是静态的,在编译时确定,而覆盖是动态的,在运行时确定。

20.main之前执行什么,之后可以执行什么?
之前执行全局变量的构造函数,之后可以定义一个onexit函数运行。

21.C++从源文件到可执行文件步骤
预处理成.i文件:处理注释、条件编译、宏代替。命令:gcc -E main.c > main.i
编译成.s文件:语法分析,检查语法错误,生成汇编。命令:gcc -S main.i -o mian.s
汇编成机器语言:变成二进制文件。命令 gcc -C mian.s -o mian.o
链接生成可执行文件。命令gcc -o main main.o

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值