MST

星途 面试题库

面试题:C++ 类成员初始化之默认值设置基础

在C++ 中,定义一个包含整型成员变量`num`、浮点型成员变量`fnum`和自定义结构体类型成员变量`st`的类`MyClass`。结构体`MyStruct`包含两个字符型成员变量`ch1`和`ch2`。请使用构造函数初始化列表为这些成员变量设置合理的默认值,`num`默认值为10,`fnum`默认值为3.14,`ch1`默认值为 'a',`ch2`默认值为 'b'。并解释为什么使用初始化列表比在构造函数体内赋值更好。
33.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

// 定义结构体
struct MyStruct {
    char ch1;
    char ch2;
};

// 定义类
class MyClass {
private:
    int num;
    float fnum;
    MyStruct st;

public:
    // 使用构造函数初始化列表初始化成员变量
    MyClass() : num(10), fnum(3.14), st({'a', 'b'}) {}

    // 打印成员变量值的函数
    void printValues() {
        std::cout << "num: " << num << std::endl;
        std::cout << "fnum: " << fnum << std::endl;
        std::cout << "ch1: " << st.ch1 << std::endl;
        std::cout << "ch2: " << st.ch2 << std::endl;
    }
};

使用初始化列表比在构造函数体内赋值更好的原因:

  1. 效率更高:对于类类型成员(如自定义结构体MyStruct),如果在构造函数体内赋值,会先调用默认构造函数初始化成员,然后再调用赋值运算符进行赋值操作。而使用初始化列表直接调用相应的构造函数进行初始化,避免了不必要的默认构造和赋值操作,减少了开销。
  2. 适用于常量成员和引用成员:常量成员和引用成员在定义后就不能再被赋值,只能在初始化阶段进行设置。初始化列表是唯一能够初始化常量成员和引用成员的地方。例如,如果MyClass中有一个常量成员const int constantNum;,必须在初始化列表中对其进行初始化MyClass() : constantNum(20) {}
  3. 代码清晰:初始化列表清晰地展示了成员变量的初始化过程,使得构造函数的意图更加明确,提高了代码的可读性。

你可以使用以下方式测试这个类:

int main() {
    MyClass obj;
    obj.printValues();
    return 0;
}

上述代码定义了一个MyClass类,使用构造函数初始化列表对成员变量进行初始化,并通过printValues函数打印成员变量的值。main函数中创建MyClass对象并调用printValues函数输出结果。