gpt4 book ai didi

c++ - 从另一个成员函数/构造函数调用 C++ 构造函数是否执行初始化列表?

转载 作者:太空狗 更新时间:2023-10-29 21:26:52 25 4
gpt4 key购买 nike

在 C++ 对象中,当您从另一个构造函数或成员函数调用构造函数时(在对象已经构造之后),您正在调用的构造函数的初始化列表是否仍会执行?

最佳答案

在 C++11 中,您可以让构造函数委托(delegate)给同一类中的另一个构造函数工作,例如1:

#include <iostream>
struct SomeType {
int number;

SomeType(int new_number) : number(new_number) {}
SomeType() : SomeType(42) {}
};

int main() {
SomeType a;
std::cout << a.number << std::endl;
}

在这种情况下,禁止在该委托(delegate)之后有初始化列表,例如将前面的示例更改为:

SomeType() : SomeType(42), number(0) {}

是一个错误。


如果问题是“给定继承关系,initaliser 列表是否仍会被调用?”答案是肯定的,例如

#include <iostream>
struct SomeBase {
SomeBase(int) {}
};

struct SomeType : SomeBase {
int number;

SomeType(int new_number=0) : SomeBase(new_number), number(new_number) {}
};

int main() {
SomeType a;
std::cout << a.number << std::endl;
}

这很好,完全符合您的期望。


直接从另一个构造函数中调用构造函数是不合法的,在 C++11 之前的 C++ 中也不允许构造函数委托(delegate),因此类似于:

#include <iostream>

struct SomeType {
int number;

SomeType(int new_number) : number(new_number) {}
SomeType() {
SomeType::SomeType(0); // Error!
}
};

int main() {
SomeType a;
std::cout << a.number << std::endl;
}

是错误,不能直接表达。

以下(我猜是您在写问题时所想的)示例虽然不是错误,但并没有达到您的预期:

#include <iostream>

struct SomeType {
int number;

SomeType(int new_number) : number(new_number) {}
SomeType() {
SomeType(0);
number = 42;
}
};

int main() {
SomeType a;
std::cout << a.number << std::endl;
}

这里没有参数的构造函数构造了一个 SomeType 的匿名临时实例。它是一个完全独立于最初调用构造函数的实例。这是完全合法的,但可能不是你想要做的。如果您这样做,如果您不小心,就有可能创建无限递归的风险,我认为如果您最终做这样的事情,这可能是设计问题的一个很好的指标!

1 来自维基百科C++11 article

关于c++ - 从另一个成员函数/构造函数调用 C++ 构造函数是否执行初始化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10454644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com