C++常见面试题 | Day7
24、malloc、free 和 new、delete 的区别?
共同点:都是从堆上申请内存,需要程序员手动释放;
不同点:malloc、free是C语言的库函数,new、delete是C++的操作符;
Malloc申请的空间不可以初始化,而new出来的空间可以初始化;
Malloc申请空间时需要手动计算大小,并将其传递,而new后面只需要跟类型;
Malloc的返回值是void*,在使用时需要进行强制转换,new不需要,new后面跟的是类型;
Malloc申请空间失败时返回null,需要判断是否为空,new不需要,但是需要捕获异常;
申请自定义对象时,new和delete会分别调用构造函数和析构函数,完成对象创建的资源的回收,而malloc和free不会调用构造函数和析构函数。
25、protect 变量继承后派生类访问权限?
Public:使成员对于整个程序内(类内类外)都是可以访问的;
Protect:使派生类也可以访问其数据,但是其他函数或者类无法对其进行访问;
Private:只有他所在类的成员函数可以访问。
26、预编译阶段主要做什么?
预编译又称为预处理,是做些代码文本的替换工作;
处理以#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作阶段;
主要处理#开头的预编译指令,预编译指令指示了在程序正式编译前就有编译器进行的操作,可以放在程序中的任何位置;
C编译系统在对程序进行通常的编译之前,首先进行预处理;
C提供的预处理功能主要有以下三种:
1)宏定义
2)文件包含
3)条件编译
何时需要预编译:
总是使用不经常改动的大型代码体;程序由多个模块组成,所有模块都是用一组标准的包含文件和相同的编译选项,在这种情况下,可以将所有包含文件编译为一个“预编译头”。
27、静态编译和动态编译?
静态编译是指编译工作在编译阶段完成的,这种编译过程实在程序运行之前完成的,又称为早期编译。要实现静态编译,在编译阶段就必须确定程序中的操作调用与执行该操作代码间的关系,确定这种关系称为束定,在编译时的束定称为静态束定。
动态编译是指编译在程序运行时动态地进行,根据当时的情况来确定调用哪个同名函数,实际上是在运行时虚函数的实现。动态编译规定,只能通过指向基类的指针或基类对象的引用来调用虚函数。
28、函数重载的作用?重载、重写和覆盖的区别?
函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表必须不同,常用来处理实现功能类似数据类型不同的问题。
成员函数重载的特征:相同的范围;函数名字相同;参数不同;virtual关键字可有可无。
重写(覆盖)是指派生类函数覆盖基类函数,特征是:不同的范围,分别位于基类和派生类中;函数的名字相同;参数相同;基类函数必须有virtual关键字。
重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
A.如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
B. 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时,基类的函数被隐藏。
29、const 关键字的使用?
修饰常量:用const修饰的变量某种意义上就是常量,编译器会对它进行必要的操作比宏定义多了类型修饰符;
修饰指针:const int *p 不可以对*p赋值,可以对p复制;
Int * const p 可以对*p复制;
修饰函数:
(1) 普通函数:放在返回值前修饰返回值表示返回值必须保持其常量性,不能被更改;放在参数前修饰参数表示该参数必须保持其常量性,不能在函数体内被修改;
(2) 类成员函数:放在类成员函数尾部,表示其在函数内并不能修改对象属性,知识读取等操作非更易型操作
修饰类对象:当类的对象被声明为const类型后,他只能调用用const修改的成员函数。
30、空类编译器会自动生成哪些函数?
对于空类,声明时,编译器不会生成任何的成员函数,只会生成1个字节的占位符。定义是会生成6个成员函数,当空类empty_one定义一个对象时Empty_one pt;sizeof(pt)仍是1,但是编译器会生成6个成员函数:缺省构造函数;拷贝构造函数;析构函数;赋值运算符;2个取值运算符

浙公网安备 33010602011771号