C++ 基础知识 问答题(二)

本文是一篇关于C++基础知识的问答,涵盖了struct和class的区别、union的作用、explicit关键字、继承方式、friend关键字、范围解析运算符、枚举类型、decltype、左值和右值、引用类型、宏定义、成员初始化列表、面向对象特性、多态类型、虚函数应用以及构造函数和析构函数的调用顺序等核心概念。
摘要由CSDN通过智能技术生成

一篇见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的区别是什么?

  • 默认访问控制权限不同。struct的成员默认访问权限是public,class的成员默认访问权限是private。
  • 默认的继承类型不同。当一个子类struct继承struct或者class时,默认继承类型是public。当一个子类class继承struct或者class时,默认继承类型是private。

22.union是什么?

union允许多个数据类型共享同一块内存空间。

union中的所有成员共享一块内存空间,所有在同一时刻,只能使用其中的一个成员。

23.explicit关键字作用是什么?

禁止隐式转换和复制拷贝(A a = 1;),必须对不同类型的变量进行显示转换。

24.继承方式有哪些?

有public,protected,private三种继承方式。

基类成员在派生类中的访问权限不得高于继承方式中指定的权限。

所以:

public继承:

  • 基类中的public成员在派生类中仍为public属性
  • 基类中的protected成员在派生类中仍为protected属性
  • 基类中的private成员在派生类中不可访问

protected继承:

  • 基类中的public成员在派生类中为protected属性
  • 基类中的protected成员在派生类中仍为protected属性
  • 基类中的private成员在派生类中不可访问

private继承:

  • 基类中的public成员在派生类中仍为private属性
  • 基类中的protected成员在派生类中仍为private属性
  • 基类中的private成员在派生类中不可访问

25.friend关键字作用的什么?有哪些特点?

在类A中声明friend class B;或者friend bool func(int m);表示class B和函数 func可以访问类A的私有成员,是类A的友元类和友元函数。

特点:

  • 可以访问私有成员
  • 友元关系是单向的(A访问不了B的私有成员)
  • 友元关系不可传递
  • 破坏了类的封装性

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.面向对象的特点是什么?

封装:对外部隐藏内部的实现细节,只提供有限的接口供外部使用。通过访问控制符来控制成员变量和方法的可见性。

  • public:任何实体都可以访问
  • protected:只有本类的成员函数,继承了该类的子类的成员函数,和友元类、友元函数可以访问
  • private:只有本类的成员函数,和友元类、友元函数可以访问

继承:

子类可以继承父类的公共成员和protected成员。

多态:

同一类型的对象在不同情况下表现出不同的行为。

34.多态有哪几种?

静态多态:重载:函数名相同,函数参数的类型和数量不一样。

动态多态:用virtual修饰成员函数,当基类指针指向派生类对象时,调用一个虚函数,会根据对象的实际类型发生动态绑定。

35.哪些函数不能是虚函数?

构造函数、静态函数、普通函数(非成员函数)

36.内联函数可以是虚函数吗?

内联函数可以是虚函数,但是当虚函数表现出多态性时,该函数不会内联。

37.使用虚析构函数的目的是什么?

当基类指针指向子类对象时,执行删除功能时,会先调用子类的析构函数,再调用基类的析构函数。

如果基类的析构函数不是虚函数,那么基类指针指向子类对象时,执行删除功能时,会直接调用基类的析构函数,这样子类独有的成员就没有被释放掉。

38.默认构造函数是什么?

默认构造函数是一种特殊的构造函数,没有参数,没有函数体。

当一个类没有显式定义构造函数时,编译器会自动为这个类生成一个默认构造函数。

当一个类有显式定义构造函数时,编译器就不会自动为这个类生成一个默认构造函数。

39.当创建一个派生类的对象时,会依次调用哪些函数?

  • 调用基类的构造函数
  • 调用派生类的构造函数
  • 调用派生类的成员变量的构造函数

40.当销毁一个派生类的对象时,会依次调用哪些函数?

  • 调用派生类的成员变量的析构函数
  • 调用派生类的析构函数
  • 调用基类的析构函数

41.什么情况下,子类的构造函数中必须显式调用基类的构造函数?

当基类没有默认的构造函数时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值