【发布时间】:2021-08-19 23:50:07
【问题描述】:
AFAIK 一个类/结构/联合,它不会在构造函数初始化器列表中初始化其成员数据,然后它们被默认初始化。如果成员数据是内置整数类型,则它具有不确定的值。如果它是类类型,则调用其 default-ctor(需要可访问且不可删除的 default-ctor)。
这是我的例子:
struct A{
A(){std::cout << "A()\n";}
A(int){std::cout << "A(int)\n";}
A(A const&){std::cout << "A(A const&)\n";}
~A(){std::cout << "~A()\n";}
A& operator = (A const& ){std::cout << "=(Aconst&)\n"; return *this;}
};
struct B{
B(int){std::cout << "B(int)\n";} // a_ and d_ are default-init
double d_;
A a_;
};
B b = 10;
输出:
A()
B(int)
~A()
- 没关系,因此构造函数
B(int)不会显式初始化其ctor-init 列表中的成员d_和a_,因此它们是默认初始化。d_有一个未定义的值。而a_是默认初始化。
直到这里我都还好,但是 union 的成员呢:
union U{
U(){std::cout << "U()\n";} // needed because a_'s class type has defined a user-defined version
U(U const&){std::cout << "U(U const&)\n";} // needed as above
~U(){std::cout << "~U()\n";} // needed as above
A a_; // has defined copy-control members
int i_;
};
U u1;
U u2 = u1;
输出:
U()
U(U const&)
~U()
~U()
- 如您所见:
union U没有在其 ctor-init-list 中初始化其成员数据a_和i_,这些成员也没有在类内初始化,但没有调用它们的构造函数!所以:
union 的成员数据是否在构造函数初始化列表中被默认初始化?谢谢!
【问题讨论】:
-
您希望
union准确调用哪个成员构造函数?如果多个联合成员属于定义了构造函数的类型怎么办?它不能多次初始化同一个内存。在将值实际分配给union之前,它甚至不知道哪个成员处于活动状态。事实上,在 C++11 之前,联合甚至不能容纳定义了构造函数的成员。在现代 C++ 中处理同一内存中的多种类型的正确方法是尽可能使用std::variant而不是union。 -
工会一次只有一个有效成员。您如何期望 C++ 选择初始化哪个?如果它们都是类类型,那么对它们进行初始化将是一个主要问题,因为第二次初始化会随机地覆盖之前由第一次初始化写入的内存。
-
您希望 C++ 如何选择初始化哪个? 当然是心灵感应。我们应该用 C++8191 解决这个问题。
标签: c++ class initialization union