c++面试、复试 常用问题总结
C++重载:
为什么c++支持重载函数:因为c++编译器在命名时候做了相对于C的改变,记录下了参数列表等信息确保了不重名,所以支持重载。(本质是参数列表不同)
三大特性:
- 封装:为了将代码模块化,隐藏细节,方便使用
- 多态:实现接口的复用性
- 继承:代码的复用性
- 抽象
- 对象
C++默认是私有的,public,private,protected这些操作符的使用体现了封装特性
析构函数
- 构造函数名字加上~
- 没有参数,没有返回值
- 一个类有且仅有一个析构函数,如果没实现,则默认系统自带的析构函数(指针的时候必须自己实现)。
- 系统自己调用析构函数
- 析构函数并不是删除对象的操作,而是做一些清理工作
赋值操作符重载:
- 目的:增强代码的可读性。
- 不可以重载的5个运算符:
.* :: sizeof ?:(三目运算法) .成员访问->
Const函数修饰
- Const修饰this指针所指向的内容,保证了这个对象在函数内部是不会改变的
- Const+对象
可以调用const成员函数,但是不能调用非const成员函数
非const对象两者都可以调用 - Const+成员函数
可以调用其他const成员函数,但是不能调用其他的非const成员函数。
非const成员函数两者均可以调用
Inline内联函数
- 特点:对于编译来说,内联函数知识提供建议,编译器会根据实际需要选择是否设置为内联函数
- 编译期间只会在使用内联函数的地方展开,没有压栈的开销(空间换取时间)
- 定义在类内的内部成员函数默认定义为内联函数
- Inline必须和函数的定义放在一起,仅仅声明无效。
- 当代码题较长,不适用内联函数
C++中建议用const/ enum /inline代替宏?
- 宏有其优点,增强了代码的复用性,提高了性能
- 但是代码的可读性差,可维护性差,一个域中不能多次使用。而且调试不方便,再开始预处理时候就已经替换了宏函数
Class与struct
默认的访问权限不同、默认的继承方式(c++中struct也可以继承)不同,class可以用模板参数。
指针和引用:;
- 区别:引用仅仅是别名,但是指针存的是变量的地址,两个不同的空间,指针是可以改变的,指针可以为空,并且可以加const修饰。引用可以不用解*指针,直接使用。
Sizeof(引用)=变量的大小 sizeof(指针),表示的是指针的大小。
引用能用不一定消耗内存空间,底层实现是一样的,但是指针需要占用内存空间。
动态内存管理
- C语言中使用malloc free管理内存
- C++使用new delete管理,new delete除了分配空间,还会调用构造函数和析构函数进行初始化和清理。 Malloc失败了返回0,new失败了会抛出异常。
- 内存泄漏:动态开辟的内存的空间没有释放,(new没有delete 没有调用析构函数)
拷贝
- 浅拷贝:在拷贝构造函数直接将原地址内容给拷贝对象,两个对象共同赋予同一地址空间,对原内容发生改变,就会影响现在的内容
- 深拷贝:开辟和源空间相同大小的空间,并且拷贝内容,在拷贝内容,(后面两者的空间独立操作)。
虚函数:即在类的成员函数前面加上virtual
- 纯虚函数:是为了继承改写的函数,含有纯虚函数的类就是抽象类,,这个类并不能实例化对象。
- 只有类的成员函数才能定义成虚函数,基类定义的虚函数在派生类中该函数仍然保留这虚函数属性,可以被重载。
- 重载:函数名相同,参数列表不同,返回值可相同可不同
重写:在不同的作用域内,且基类必须有虚函数定义,其他参数均相同。
重定义:在不同的作用域内函数名相同
多态:1虚函数的重写 ,基函数有virtual字段修辞
2父类的指针或者引用
为什么基类的析构函数要定义为虚函数?
防止只析构了基类而不析构派生类的状况发生! 在public继承中,基类对于派生类的对象进行操作,只可以影响到继承下来的成员,当然析构函数也不例外,如果基类想对于派生类的非继承成员进行操作,就必须把基类的函数定义为虚函数。