gpt4 book ai didi

C++ 类 : Is it possible to select a member's constructor in a constructor body?(没有双重初始化成员)

转载 作者:太空宇宙 更新时间:2023-11-04 15:02:09 24 4
gpt4 key购买 nike

考虑一下:

class Foo {
private:
Bar x;

public:
Foo(int a) { // no initialization here since constructor is dependent on a following if-block
if (a==0) x=Bar(12,'a', 34); // some (int, char, int) constructor of Bar
else x=Bar(13); // (int) constructor of Bar
}
}

这应该做的是检查参数 a 的值,并根据 a 的值使用特定构造函数和特定参数初始化 Bar x。然而,问题是,这当然会被编译器读取为

        Foo(int a): Bar() { // !
if (a==0) x=Bar(12,'a', 34); // some Bar(int, char, int) constructor of Bar
else x=Bar(13); // Bar(int) constructor of Bar
}

编译器将 Bar() 添加到初始化列表中,因为我省略了它。它现在被双重初始化,一次使用它的 () 构造函数,一次在函数体中。但是,如果初始化 Bar(即使使用其默认构造函数)成本非常高(关于性能)并且我不能或不想进行这种双重初始化怎么办?

我怎么能不初始化 Bar x,直到在实际的构造函数体中?如果这不可能,我将如何最好地解决这个问题?

补充一点:为什么 C++ 是这样设计的?为什么它强制在实际构造函数主体之前初始化成员?

最佳答案

我认为你问错了问题,而不是试图禁止初始化,你应该这样做,即将你的 ctor 拼写为:

Foo(int a) : x((a==0) ? Bar(12,'a', 34) : Bar(13)) {}

这不会导致任何复制或移动(请参阅 here ),并且它是惯用的。

关于C++ 类 : Is it possible to select a member's constructor in a constructor body?(没有双重初始化成员),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30794334/

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