C++面试点

1、指针和引用的区别

1)指针在内存当中有自己的一块空间,引用只是一个别名。
2)指针可以被初始化为NULL,而引用必须被初始化且有一个已知的变量。
3)作为参数传递时,指针需要解引用,而引用可以直接操作。
4)指针可以多级指针,但引用只有一级。
5)指针++和引用++不一样
6)如果返回动态内存分配的对象或者内存,必须用指针,引用有肯能引起内存泄漏。

2、智能指针

1)智能指针的作用是管理一个指针,因为指针指针是一个类,在作用于结束的时候会自动调用析构函数,析构函数会自动释放资源,从而避免内存泄漏。
Auto_ptr:采用所有权模式
**Unique_ptr:用来代替auto_ptr,实现独占式,保证同一时间只有一个智能指针可以指向该对象。
shared_ptr:共享式拥有,多个智能指针指向同一个对象,有独特的计数机制,当计数为0时会释放指向的对象。
Weak_ptr:是一种不控制对象生命周期的智能指针,用于辅助shared_ptr
,解决互相引用时发生的死锁问题,**weak_ptr不会使引用计数增加或减少。和shared_ptr之间可以象话转化。

3、智能指针有没有内存泄漏的情况?

有的,大概两个对象互相用一个share_ptr只想对方的时候,会造成循环引用,这时候计数会重复,在释放的时候计数没法降到0.,以致没有调用析构函数导致内存泄漏,这时候就需要使用weak_ptr来避免这种情况发生了。

4、指针和数组的区别?

在这里插入图片描述

5、野指针

野指针就是指向一个已经删除的对象或者未申请访问权限内存区域的指针

6、为甚析构函数必须是虚函数,为什么C++默认的析构函数不是虚函数?

将可能被继承的父类的析构函数设置为虚函数是未来避免在使用多态的时候,new一个子类然后永福类指针指向子类的时候能够调用子类的析构函数,避免内存泄漏。
C++默认的析构函数不是虚函数,是因为虚函数需要建立虚函数指针以及虚函数表,对于不需要被继承的类来说增加了内存的开销。

7、函数指针

函数指针是一个指向函数的指针变量,在编译的时候,每个函数都有一个入口地址,该入口地址就是函数指针指向的地址,可以用该指针变量调用函数和做函数的参数,比如回调函数。

8、fork函数

创建一个和当前进程映像一样的新进程,两个进程都会继续进行,在父进程中fork会返回紫禁城的pid,在紫禁城中会返回0,如果出现错误会返回负值。

9、析构函数的作用

当对象结束生命周期的时候,会自动调用析构函数。
析构函数不带任何参数,不带返回值,不能重载。
如果没有定义析构函数,编译系统会自动生成一个缺省的析构函数。
如果类里面有指针,且在使用的过程中使用了动态分配的内存,则需要显式的在析构函数中释放掉申请的内存空间,避免内存泄漏。析构函数的调用顺序与构造时相反。

10、静态函数和虚函数的区别

静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候进行动态绑定。虚函数因为用来虚函数表的机制所以每次调用的时候都会增加一次内存消耗。

11、重载和重写

重载:主要作用在类里面,两个函数名字相同,但函数参数的个数类型不一样
重写:子类继承父类,父类中的函数都是虚函数,子类重新定义这个虚函数。通过父类指针指向子类来实现同一函数名,不同子类不同功能。

12、strcpy和strlen

strcpy:字符串拷贝,会把字符串从头一直拷贝到’\0’,因为没有指定长度,所以坑导致月结的情况,安全版本为函数strncpy
strlen:计算字符串的长度,返回从开始到’\0’之间的字符个数。

13、虚函数和多态

多态分为静多态和动态多态,静态多态也就是重载,在编译的时候就已经确定运行的实际,而动态多态主要是靠虚函数来实现的,在运行的时候进行动态绑定,根据虚函数指针来确定实际运行的函数。
虚函数:虚函数的实现依靠虚函数指针和虚函数表机制,在父类将函数设置为virtual,在编译时会在类的头部建立一个库函数指针指向一个虚函数表,子类重写虚函数的时候会替换虚函数表中的对应的函数地址。使用虚函数会增加额外的内存开销,降低效率。

14、请你来写个函数在main函数执行前先运行

__attribute((constructor))void before()
{
}

15、常量

常量在C++中的定义就是一个top-level const加上对象类型,常量定义必须初始化**。局部对象常量放在栈区,对于全局对象常量放在静态存储区,字面常量放在常量存储区。**

16、const修饰成员函数的目的是什么?

const修饰的成员函数表明函数调用不会对对象做出任何修改,如果确定不会对象进行修改最好加上const修饰,这样无论是普通对象还是const对象都能调用该函数。

17、隐式类型转换

例如,低精度的变量给搞景区变量赋值就会发生饮食类型转化

18、C++函数栈空间的最大值

默认是1M,不过可以调整

19、extern “C”

C++调用C函数需要用到,因为C语言没有函数重载。

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

new/delete是C++的关键字,不用指定内存大小,返回对应指针,对于类对象还会调用构造函数和析构函数。
malloc/free是C的库函数,使用的时候必须指明申请的内存空间的大小,返回void*,必须强制转换,不会调用构造函数和析构函数
1、new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配
2、new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化。

3、new不仅分配一段内存,而且会调用构造函数&#

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值