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

标签 c++ parameters constructor default-constructor initialization-list

考虑一下:

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/

相关文章:

ssis - 如何将变量或参数从 .NET 传递到包?

mysql_fetch_assoc() 参数 1 资源,对象在第 6 行 ... 中给出

c++ - 从构造函数内 - 有条件地调用成员变量的构造函数重载

c++ - 虚幻引擎 4.18.2 "no default constructor exists for class "UUserWidget""

c++ - 理解这个合并排序算法?

c++ - G++ 在 makefile 中使用时停止工作

c++ - 类成员的C++模式,只能在operator =()中进行修改

C++ valgrind : Conditional jump or move depends on uninitialised value(s) don't know what to initialize

java - Eclipse RCP 4 - 处理程序方法参数

java - 为什么在声明子类的对象时会调用父类(super class)的构造函数? ( java )