一篇见C++ 基础知识 问答题(一)_绿风天空的博客-CSDN博客
Part 1是题目, Part2是答案。
Part 1
21.struct和class的区别是什么?
22.union是什么?
23.explicit关键字作用是什么?
24.继承方式有哪些?
25.friend关键字作用的什么?有哪些特点?
26.范围解析运算符::的使用场景有哪些?
27.enum是什么?如何使用?
28.decltype是什么?在什么场景下使用?
29.左值是什么?右值是什么?
30.左值引用是什么?右值引用是什么?
31.宏定义是什么?
32.成员初始化列表是什么?使用成员初始化列表的优点有哪些?
33.面向对象的特点是什么?
34.多态有哪几种?
35.哪些函数不能是虚函数?
36.内联函数可以是虚函数吗?
37.使用虚析构函数的目的是什么?
38.默认构造函数是什么?
39.当创建一个派生类的对象时,会依次调用哪些函数?
40.当销毁一个派生类的对象时,会依次调用哪些函数?
41.什么情况下,子类的构造函数中必须显式调用基类的构造函数?
Part2
21.struct和class的区别是什么?
22.union是什么?
union允许多个数据类型共享同一块内存空间。
union中的所有成员共享一块内存空间,所有在同一时刻,只能使用其中的一个成员。
23.explicit关键字作用是什么?
禁止隐式转换和复制拷贝(A a = 1;),必须对不同类型的变量进行显示转换。
24.继承方式有哪些?
有public,protected,private三种继承方式。
基类成员在派生类中的访问权限不得高于继承方式中指定的权限。
所以:
public继承:
protected继承:
private继承:
25.friend关键字作用的什么?有哪些特点?
在类A中声明friend class B;或者friend bool func(int m);表示class B和函数 func可以访问类A的私有成员,是类A的友元类和友元函数。
特点:
26.范围解析运算符::的使用场景有哪些?
全局作用域符 ::a
类作用域符 A::a
命名空间作用域符 std::cout
27.enum是什么?如何使用?
enum是指枚举类型,是用户自定义的一组具有相同类型的常量。
枚举类型中的每个元素都是一个枚举常量,用来代表某种状态或类型。
其中枚举常量的取值默认从0开始,依次递增,也可以用等号来指定。
enum Fruit { apple, banana, bear };
Fruit f = bear;
或者
enum Fruit { apple, banana=4, bear };
28.decltype是什么?在什么场景下使用?
decltype(expression)可以得到表达式expression的数据类型。
例如 decltype(func(9,87)) a;
常用于泛型编程中,在编译时获得表达式的数据类型。
29.左值是什么?右值是什么?
左值是指向内存地址的表达式。可以在赋值语句的左边或者右边使用。左值可以取地址,可以绑定给引用。例如变量,数组变量,对象。
右值是不指向内存地址的表达式。只能出现在赋值语句的右边,不能取地址,不能绑定给引用。例如临时变量,返回值,字面值。
30.左值引用是什么?右值引用是什么?
左值引用就是正常的引用,比如:int& a = b;
右值引用是指将本来不能绑定到引用的右值,可以绑定到右值引用了。实现了移动语义和完美转发。比如int&& a = b+c;
31.宏定义是什么?
预处理指令。可以在编译之前进行文本替换。因为是直接替换,所以会出现一些问题。
#define Pi 3.14
32.成员初始化列表是什么?使用成员初始化列表的优点有哪些?
成员初始化列表是在构造函数中初始化成员变量的方式。
A(int a, bool flag): b(a), value(flag){//...}
常量和引用不能赋值,所以只能使用成员初始化列表来初始化。
优点:可以少一次调用默认构造函数的过程。如果不使用成员列表初始化,而在构造函数中对成员变量赋值,那么编译器会先调用默认构造函数来创建成员变量,再使用构造函数对成员变量赋值。
33.面向对象的特点是什么?
封装:对外部隐藏内部的实现细节,只提供有限的接口供外部使用。通过访问控制符来控制成员变量和方法的可见性。
继承:
子类可以继承父类的公共成员和protected成员。
多态:
同一类型的对象在不同情况下表现出不同的行为。
34.多态有哪几种?
静态多态:重载:函数名相同,函数参数的类型和数量不一样。
动态多态:用virtual修饰成员函数,当基类指针指向派生类对象时,调用一个虚函数,会根据对象的实际类型发生动态绑定。
35.哪些函数不能是虚函数?
构造函数、静态函数、普通函数(非成员函数)
36.内联函数可以是虚函数吗?
内联函数可以是虚函数,但是当虚函数表现出多态性时,该函数不会内联。
37.使用虚析构函数的目的是什么?
当基类指针指向子类对象时,执行删除功能时,会先调用子类的析构函数,再调用基类的析构函数。
如果基类的析构函数不是虚函数,那么基类指针指向子类对象时,执行删除功能时,会直接调用基类的析构函数,这样子类独有的成员就没有被释放掉。
38.默认构造函数是什么?
默认构造函数是一种特殊的构造函数,没有参数,没有函数体。
当一个类没有显式定义构造函数时,编译器会自动为这个类生成一个默认构造函数。
当一个类有显式定义构造函数时,编译器就不会自动为这个类生成一个默认构造函数。
39.当创建一个派生类的对象时,会依次调用哪些函数?
40.当销毁一个派生类的对象时,会依次调用哪些函数?
41.什么情况下,子类的构造函数中必须显式调用基类的构造函数?
当基类没有默认的构造函数时。