C++面经 100题(21-40)
为什么需要使用堆,使用堆空间的原因?
- 直到运行时候对象才知道要多大内存,不知道对象生存期多长
数组名作实参而指针变量作形参,函数调用实参传给形参的是?
- 数组第一个元素的地址
为什么数组名作为参数会改变数组内容,而其它类型如int却不会改变变量的值?
析构函数何虚函数的用法和作用?
析构函数:特殊的类成员函数,没有返回类型、参数,不能随意调用,也没有重载,只有在类对象的生命周期结束时,由系统自动调用,释放内存空间。
虚函数:c++多态的一种表现,使用虚函数,,我们能灵活进行动态绑定,花费一定开销
析构函数也可能时虚函数吗?
- 可能,虚析构函数在如下情况也存在
1
2
3
4
5
6
7class A {}; // A为父类
class B : A {}; // B为子类
A &a = new B(); // reference class B object
delete a; // virtual destructor
// 这里调用A的析构函数,但是A是B类的引用变量,所以B还有额外的空间没有被销毁,所以继承时,把父类析构函数定义成虚的,防止父类引用关联了子类对象。
'\091'
'\\'
'\0'
'\''
错误的转义字符为?'\091'
- 使用转义的原因:c语言中键盘中没有办法输入但是又存在这个字符
% '' ""
,也可以是三个8进制数(0~7) \023
,也可以时两个16进制数(0~f) \af
如果
ClassA
定义并实现虚函数int func(void)
,ClassB
中也实现该函数,那么上述变量a->func()
将调用哪个类里面的函数?如果int func(void)
不是虚函数,情况又如何?why?- 第一问调用B的
- 第二问调用A的
- 虚函数的典型应用,虚函数只能借助于指针or引用来达到多态的效果
引用和指针有什么区别?
- 引用必须被初始化
- 引用初始化以后不能被改变,指针可以改变所指对象
- 不存在指向空值的引用,存在指向空值的指针
如果不使用常量,直接在程序中填写数字或字符串将会有什么麻烦?
- 可读性变差
- 多处输入相同,易错
- 如果要修改则会在很多地方改动,麻烦又易错
c++有没有纯虚构造函数?
- 构造函数不能为虚函数,构造函数为显式调用
重复多次
fclose
一个打开过一次的FILE *fp
指针会有什么结果?- 导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。
重载(overload)、重写(override 也叫“覆盖”)、重定义(redefinition)的区别?
- 重载:同一个类中
- 重写:继承链中,子类去重新实现父类的同名函数,不能变换函数名、形参类型、个数,返回值无所谓
- 重定义:第二种情况中,父类如果不是虚函数,则为子类完全重新实现父类函数
c++里面是不是所有动作都是
main()
引起的?如果不是,请举例- 不一定
1
2
3
4
5class A{};
A a; // a的构造函数执行
int main(){}
// 比如上面全局变量的初始化,就不是由main函数引起的main函数执行前还会执行什么代码?
- 全局对象的构造函数会在main函数之前执行
c++中
virtual
和inline
含义分别是什么?virtual
(强制)主要用于声明虚函数,抽象类、纯虚函数、多态inline
声明内联函数
const
关键字有哪些作用?- 总的说:只读,不能改
- 欲阻止一个变量被改变
- 对指针,可以指定指针本身or指针所指数据为
const
- 修饰形参,表明函数内部不能修改
- 修饰类成员函数,有时候必须指定其返回值为
const
类型,使得其返回值不为”左值”
编译中Debug与Release选项是什么含义?
- Debug模式下会有额外信息,同时不做任何优化,主要用于调试/编辑测试阶段
- Release模式下会把运行不相关的信息删掉,速度、文件大小都会有相应优化,用于发布阶段
是不是一个父类写了一个
virtual
函数,如果子类覆盖它的函数不加virtual
,也能实现多态?virtual
修饰符会被隐形继承的,virtual
可加可不加。子类空间里有父类所有变量(除了static)。- 同一个函数只存在一个实体(
inline
除外),子类覆盖它的函数不加virtual
也能实现多态 - 在子类空间中,有父类的私有变量,私有变量不能直接访问
下面代码,变量val内存地址位于?
1
2
3
4void func() {
static int val;
...
}- 已初始化数据段
在不用第三方参数情况下,交换两个参数的值
1
2
3
4
5
6
7
8
9// methed 1
a = a + b;
b = a - b;
a = a - b;
// method 2
a = a ^ b
b = a ^ b
a = a ^ b如何打印出当前源文件文件名以及源文件的当前行号?
1
2
3cout << __FILE__;
cout << __LINE__;
// 两个系统预定义宏,是由编译器定义
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!