C++面试常见问答题看这三篇文章就够了(中)
目录
17. #if defined() 和#if !defined()的简写方式
前言
《C++面试常见问答题看这三篇文章就够了(中)》本文
正文
1. 构造函数为什么不能声明为虚函数?
1)构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类,无法确定。
2)虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。
2. 析构函数为什么声明为虚函数?
如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。
3. C++中,能作为函数重载判断依据的是?
const、参数个数、参数顺序。
4. 浅复制和深复制的区别
1)浅层复制,只复制指向对象的指针,而不复制引用对象本身。
2)深层复制,复制引用对象本身。
3)如果是浅复制,修改一个对象可能会影响另外一个对象。
4)如果是深拷贝,修改一个对象不会影响到另外一个对象。
5. 使用select函数检查读超时的用法
if (select(sockfd + 1,&fs,NULL,NULL,&timeout) == 0)
6. 外部变量定义在所有函数之外,它的作用域?
其定义位置开始到整个文件结束。
7. 模板的使用是为了什么?
提高代码的可重用性。
8. 不能被重载的运算符
1、. (成员访问运算符) 2、.* (成员指针访问运算符) 3、:: (域运算符) 4、sizeof(长度运算符) 5、?: (条件运算符)
9. 采用函数重载的目的是什么?
使用方便,提高可靠性。
10. const和#define定义常量的区别
1)define宏是在预处理阶段展开,const常量是编译运行阶段使用。
2)宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。
3)define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)。
11. 调用一成员函数时, 使用动态联编的情况是?
通过指针或引用调用一虚函数。
12. 在结构化的程序设计中,模块划分的原则是?
模块内具有高内聚度,模块间具有低耦合度。
13. 若main()函数带参数 ,参数个数最多是几个?
2个,请看定义形式:
main(int argc,char* argv[])
14. char是有符号还是无符号类型?
取决于具体实现。
15. 哪些因素可能会影响到一个类的大小?
成员个数、是否有虚函数、对齐方式。
16. &和&&的区别
1)对于&和&&,当运算符两边的表达式为true时,结果均为true,只要有一边运算结果为false,则结果均为false。
2)如果运算符左边计算结果为false,则&&不会再继续计算右边表达式值。
3)&可以作为位运算符,而&&不能。
17. #if defined() 和#if !defined()的简写方式
#ifdef 和 #ifndef
文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。
原文链接:liuzhen.blog.csdn.net/article/details/110506813
- 点赞
- 收藏
- 关注作者
评论(0)