让构造函数在其初始化列表中调用同一类的另一个构造函数是否有效

Is it valid to have a constructor call another constructor of the same class in its initialization list?

本文关键字:构造函数 一类 另一个 有效 是否 初始化 列表 调用      更新时间:2023-10-16
#include <iostream>
#include <string>
class Data
{
    private:
    int day, month, year;
    public:
    Data() : Data(0,0,0) {};
    Data(int d, int m, int y) : day(d) , month(m), year(y) {}
    void print() { std::cout << day << " " << month << " "<< year << std::endl; }
};
int main()
{
    Data a;
    a.print(); //ok - output: 0,0,0 and no compiler errors
}
构造函数

没有返回值,并且在创建对象时调用构造函数,这意味着可以初始化数据,那么当我从另一个构造函数调用构造函数时,这完全有效吗?

我还注意到Data() { Data(0,0,0); };不会初始化当前的类数据成员。

为什么Data() : Data(0,0,0) {};有效而Data() { Data(0,0,0); };无效?

执行是完美的练习:

Data() : Data(0,0,0) {};

您只需使用初始值设定项列表进行调用。

原因

Data() {
    Data(0,0,0);
}

没有工作是因为您所做的只是在构造函数内的堆栈上创建了一个"匿名"Data对象,一旦默认构造函数完成,该对象将被破坏。