MST

星途 面试题库

面试题:C++构造函数重载与初始化列表

定义一个C++类,其中包含一个常量成员变量和一个引用成员变量。通过构造函数重载,使用初始化列表分别对这两个特殊成员变量以及其他普通成员变量进行初始化。展示如何在不同参数情况下,正确初始化这些成员变量,并说明为什么要使用初始化列表来初始化常量和引用成员变量。
24.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class MyClass {
private:
    const int constantValue;
    int& referenceValue;
    int normalValue;

public:
    // 构造函数重载,带三个参数
    MyClass(int constVal, int& refVal, int normVal) : constantValue(constVal), referenceValue(refVal), normalValue(normVal) {
        // 构造函数体可以为空,初始化在初始化列表中完成
    }

    // 构造函数重载,带两个参数(假设使用一个默认值来初始化普通变量)
    MyClass(int constVal, int& refVal) : constantValue(constVal), referenceValue(refVal), normalValue(0) {
        // 构造函数体可以为空,初始化在初始化列表中完成
    }

    void printValues() const {
        std::cout << "Constant Value: " << constantValue << std::endl;
        std::cout << "Reference Value: " << referenceValue << std::endl;
        std::cout << "Normal Value: " << normalValue << std::endl;
    }
};

在C++中,常量成员变量一旦初始化后就不能再修改,引用成员变量在定义后必须马上初始化且不能重新绑定到其他对象。因此,必须使用初始化列表来初始化常量和引用成员变量。在构造函数体中,这些成员变量已经被隐式创建,再对它们赋值就相当于试图修改常量或重新绑定引用,这是不允许的。只有在初始化列表中,才能在对象创建时对这些特殊成员变量进行初始化。

示例使用:

int main() {
    int num = 10;
    MyClass obj1(5, num, 15);
    obj1.printValues();

    MyClass obj2(3, num);
    obj2.printValues();

    return 0;
}