C++面经 100题(1-20)
这里面的知识对不对还有待考证
判断一段程序是什么编译器编译?
- 看有没有对应的预定义宏
1
2
3
4
5#ifdef __cplusplus
cout << "c++";
#else
cout << "c";
#endifc++中的传值方式有几种?
- 值传递、指针传递、引用传递
虚函数c++
1. 多态:重写父类同名函数,让程序根据实际情况运行不同函数 2. 纯虚函数:主要用于定义抽象类 3. 提示可能在子类中被重写,还有就是动态绑定
c和c++有什么不同?
语法
高级特性
场景
效率
1
2
3机制上:c面向过程;c++面向对象
适用方向:c适合代码体积小,效率高的场合,如嵌入式;c++适合更上层
名称上可看出c++是c的超集
c和c++中struct区别?
protection行为 能否定义函数 c 无 否,但可以有函数指针 c++ 有,默认private 可以 c++中struct和class区别?
- 默认继承权限。如不明确指定,class的继承按照private处理,struct继承按照public处理
- 成员默认访问权限。class成员默认是private权限,struct默认是public权限
int id[sizeof(unsigned long)];
对吗?why?- 正确,这个
sizeof
是编译时运算符,编译时就确定了,可以看成和机器相关的常量
- 正确,这个
new in c++ is a ()
- library function like malloc in c [X]
- operator [√]
- key word [√]
- malloc是库函数,不在编译器控制范围内,调用时从堆中申请内存
- new是运算符,在编译器控制范围之内,调用时从对申请内存并为内存调用构造函数
变量的指针含义是指变量的
- 地址
- 但是地址值是变量的字节编号,可是指针只是变量字节编号的一部分(多字节变量,指针只是一个字节的编号,即首地址)
- 地址
多态的作用?
- 隐藏实现细节。使代码能够模块化,扩展代码,实现代码重用
- 接口重用。为了类在继承和派生时,保证正确调用家族中任一类的实例的某属性
多态类中的虚函数表时Compile-Time,还是Run-Time时建立的?
* 虚拟函数表时在编译期就建立的,各个虚拟函数这是被组织成了一个虚拟函数的入口地址的数组。而对象的隐藏成员虚拟函数表指针是在运行期,也就是构造函数被调用时进行初始化的,这是实现多态的关键。
面向对象三个基本特征?
* 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected, public) * 继承:(1、2为类继承,3为对象组合=>接口继承以及纯虚函数) * 实现继承:使用基类的属性和方法而无需额外编码能力 * 可视继承:子窗体使用父窗体的外观和实现代码 * 接口继承:仅使用属性和方法,实现之后到子类实现 * 多态:是将父对象设置成为一or多个与他子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针
内联函数在编译时是否做参数检查?
* 做,这是相对与宏的优势
内存的分配方式?
* 静态存储区域分配,编译时已经分配好,程序整个运行期间,如全局变量 * 栈分配。执行函数时,函数内局部变量的存储单元都可以在栈上创建,自动释放。分配运算内置于处理器指令集中,效率很高但容量有限 * 堆分配。动态内存分配,malloc&new申请任意多少内存,需及时free&delete
频繁使用短小函数在c和c++中用什么实现?
* c用宏定义,c++用inline
全局变量和局部变量有什么区别?是怎么实现的?操作系统怎么知道的?
* 生命周期不同:全局变量随主程序创建&销毁;局部变量在局部函数或循环体内部,退出即消失; * 使用方式不同:全局变量声明后各个部分都可使用,局部变量只能在局部使用; * 实现:全局变量在全局数据区,局部变量在栈区 * 操作系统通过内存分配位置知道是何变量。
静态全局变量作用域?
- 本文件
有了malloc/free为何还要new/delete?
* malloc/free是c/c++标准库函数,new/delete是c++关键字(or运算符) * 对于非内部数据类型的对象,需要执行构造析构函数,而malloc/free不是运算符,不在编译器的控制范围内,所以有new来完成动态内存分配,delete来清理何释放内存
c++是不是类型安全?
* 不是,两个不同类型指针之间可以强制转换(用reinterpret_cast) * 类型安全:不同数据类型的数据不能随意地转换来操作。
用c++写程序,判断os是16位还是32位?
* 定义一个指针p,打印sizeof(p),如果结果是4(32),结果为2(16) * 不大行的法二
1
2
3
4
5
6int a = ~0;
if(a > 65536) {
cout << "32 bit" << endl;
} else {
cout << "16 bit" << endl;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!