C++面试常见问答题看这三篇文章就够了(上)
目录1. 标识符的组成结构
2. 动态关联和静态关联的区别
3. 重载(overload)和重写(overried)的区别
4. class和struct的区别
5. 构造方法的特点
6. 面向对象编程的三大特征
7. 当宏定义需要定义多行代码时使用哪个符号?
8. 类A只有一个成员函数,则sizeof(A)的大小?
9. 如何引用一个已经定义过的全局变量?
10. 什么是自动变量
11. 内联函数的一般特点
12. 服务器和客户端怎么创建socket
13. clone和fork的关系
14. 类继承与权限变化
15. 函数 rewind的作用
16. 哪些常见函数不能声明为虚函数?
17. C和C++的区别
18. 运算符重载以后,其优先级可以改变吗?
19. C++处理异常机制的组成部分
20. C++中函数参数传递有几种类型
21. 如何判断一段程序是C还是C++编译的?
22. C/C++的内存有哪几种类型?
23. 一个32位的机器,其指针占多少字节?
24. 程序编译成可执行程序四个的过程
25. C++中四种强制类型转换
26. 变量i是int类型,++i和i++哪个更快一点?
27. 转换构造函数的作用
28. gcc和g++的区别
29. 已知函数 int fun( int i ),如何声明对应的函数指针pfunc?
30. 友员函数有哪些特性?
31. 对于派生类的构造函数,创建对象时构造函数执行的顺序为?
32. 什么情况下,成员变量只能用初始化列表?
前言
《C++面试常见问答题看这三篇文章就够了(上)》本文
《C++面试常见问答题看这三篇文章就够了(中)》
《C++面试常见问答题看这三篇文章就够了(下)》
正文
1. 标识符的组成结构
标识符一般遵循三个规则:
1)由字母、数字和下划线组成。
2)开头必须是字母或者下划线。
3)不能使用C关键字。
2. 动态关联和静态关联的区别
通过基类指针调用虚函数的方式是动态关联,通过对象调用虚函数的方式是静态关联。
3. 重载(overload)和重写(overried)的区别
重载:是指函数名相同,而参数列表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义父类虚函数的方法。和多态真正相关。
4. class和struct的区别
1)class中成员默认是private,struct中成员默认是public。
2)在继承关系中,class默认是private,而struct默认是public。
3)class可用于定义模板参数,但是strcut不能。
5. 构造方法的特点
1)构造方法的方法名必须与类名相同。
2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
4)构造方法不能由编程人员调用,而要系统调用。
5)一个类可以定义多个构造方法,如果没有定义构造方法,编译系统会自动插入一个默认的无参构造方法,这个构造方法不执行任何代码。
6)构造方法可以重载,以参数的个数,类型,或排列顺序区分。
6. 面向对象编程的三大特征
继承、封装、多态。
7. 当宏定义需要定义多行代码时使用哪个符号?
转义字符\,注意不是/,不要混淆。
⚠️特别是在做选择题的时候,不要弄混!
8. 类A只有一个成员函数,则sizeof(A)的大小?
sizeof(A)=1,C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。其中,类的大小与它的构造函数、析构函数以及其他成员函数无关,只与它的数据成员相关。这里有一个类比公式:类的大小 = 虚函数指针 + 所有非静态数据成员大小 + 因对齐多占的字节大小。
9. 如何引用一个已经定义过的全局变量?
用extern关键字方式。
10. 什么是自动变量
一般情况下,不作专门说明的局部变量,均是自动变量。自动变量也可用关键字auto作出说明。
11. 内联函数的一般特点
1)不是任何一个函数都可定义成内联函数。
2)内联函数的函数体内不能含有复杂的结构控制语句。
3)内联函数一般适合于只有1~5行语句的小函数。
12. 服务器和客户端怎么创建socket
ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket。
Socket(InetAddress address , int port)是创建客户端连接主机的socket流,其中InetAddress是用来记录主机的类,port指定端口。
13. clone和fork的关系
clone是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等。
14. 类继承与权限变化
类成员 / 继承方式public继承protected继承private继承基类的public成员publicprotectedprivate基类的protected成员protectedprotectedprivate基类的private成员private (在派生类中不可见)private (在派生类中不可见)private (在派生类中不可见)15. 函数 rewind的作用
使位置指针重新返回文件的开头。
16. 哪些常见函数不能声明为虚函数?
普通函数(非成员函数),静态成员函数,内联成员函数,构造函数,友元函数。
17. C和C++的区别
1)C语言是面向过程的语言,他的核心是函数。
2)C++是面向对象的语言,他的核心是类和对象。
3)C++是c语言的超集。
18. 运算符重载以后,其优先级可以改变吗?
不可以!
19. C++处理异常机制的组成部分
检查、抛出、捕获。
20. C++中函数参数传递有几种类型
值传递、指针地址传递、引用传递。
21. 如何判断一段程序是C还是C++编译的?
#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
22. C/C++的内存有哪几种类型?
内存有五种类型:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)和常量存储区(常量)。
全局变量、static变量会初始化为零,而堆和栈上的变量是随机的,不确定的。
23. 一个32位的机器,其指针占多少字节?
4字节。
24. 程序编译成可执行程序四个的过程
预处理、编译、汇编和链接。
25. C++中四种强制类型转换
1)static_cast
a. 用于基本类型间的转换。
b. 不能用于基本类型指针间的转换。
c. 用于有继承关系类对象间的转换和类指针间的转换。
2)dynamic_cast
a. 用于有继承关系的类指针间的转换。
b. 用于有交叉关系的类指针间的转换。
c. 具有类型检查的功能。
d. 需要虚函数的支持。
3)reinterpret_cast
a. 用于指针间的类型转换。
b. 用于整数和指针间的类型转换。
4)const_cast
a. 用于去掉变量的const属性。
b. 转换的目标类型必须是指针或者引用。
26. 变量i是int类型,++i和i++哪个更快一点?
理论上++i更快,实际上与编译器优化有关,一般差别不大。
27. 转换构造函数的作用
转换构造函数(conversion constructor function) 的作用是将一个其他类型的数据转换成一个类的对象。
注意:转换构造函数只能有一个参数。如果有多个参数,就不是转换构造函数。如果有多个参数的话,就不知道是把哪个参数转换成Complex类的对象了。
28. gcc和g++的区别
小写gcc和大写GCC是两个不同的东西,GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAVA、Fortran、Pascal、Object-C等语言。
gcc是GCC中的GUN C Compiler(C 编译器);
g++是GCC中的GUN C++ Compiler(C++编译器);
另外,二者的主要区别还有:
1)对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)。
2)对于 *.c和*.cpp文件,g++会统一当做cpp文件编译。
3)使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL。
4)gcc在编译C文件时,可使用的预定义宏是比较少的。
5)当gcc在编译cpp文件或者g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
6)在用gcc编译c++文件时,为了能够使用STL,需要加参数 -lstdc++ ,但这并不代表 gcc -lstdc++ 和 g++是等价的。
29. 已知函数 int fun( int i ),如何声明对应的函数指针pfunc?
int(*pfunc)(int);
30. 友员函数有哪些特性?
1)友元函数是一种在类外定义,在类内特殊声明(加关键字friend)的函数。
2)可以在类外访问类的所有成员的非成员函数。
3)友元函数相对于普通函数,增加了访问类成员的权利。
4)友元函数可以像普通函数一样直接调用,不需要通过对象或指针。
5)友元函数不是成员函数,所以不能被继承,也同样没有this指针。
6)友元函数和普通函数的区别在于是否具有访问类成员的权利。
7)友元函数在一定程度上破坏了类的封装特性。
31. 对于派生类的构造函数,创建对象时构造函数执行的顺序为?
1)基类的构造函数。
2)成员对象构造函数。
3)派生类本身的构造函数。
记忆方式:先父母,再客人,后自己。
32. 什么情况下,成员变量只能用初始化列表?
1)当类中含有const成员变量。
2)当类中含有reference成员变量。
文档来源:51CTO技术博客https://blog.51cto.com/u_14832233/2987748
页:
[1]