为什么不对联合成员数据进行默认初始化?
Why aren't union member data default-initialized?
AFAIK a class/struct/union 没有在构造函数初始化列表中初始化其成员数据,然后它们被默认初始化。如果成员数据是内置整数类型,则它具有不确定的值。如果它是 class 类型,则调用其默认构造函数(需要可访问且未删除的默认构造函数)。
这是我的例子:
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_
,这些成员也没有 in-class 初始值设定项,但没有调用它们的构造函数!所以:
union
的成员数据是否在构造函数初始化列表中被默认初始化?谢谢!
So as you can see: the union U didn't initialize its member data a_ and i_
一个联合只有一个成员处于活动状态,因此永远不会出现两个成员可以被初始化的情况。
如果您不在用户定义的构造函数中提供初始化程序,则不会初始化任何联合成员。
联合只是一个位置的多个名称(引用)
无论修改哪个成员,都只会处理一个位置
因此所有其他成员都将被修改
union _Union{
int i; // 4 bytes.
long ll; // 4 bytes.
float f; // 4 bytes.
char*txt; // 4 bytes.
};
sizeof(_Union) = 4 bytes
如果结构大小为 16 字节
联合的大小是最大成员的大小
如果上面 _Union
有另一个 long long int
成员那么它的大小将是 8 个字节
因为 long long int
是 8
AFAIK a class/struct/union 没有在构造函数初始化列表中初始化其成员数据,然后它们被默认初始化。如果成员数据是内置整数类型,则它具有不确定的值。如果它是 class 类型,则调用其默认构造函数(需要可访问且未删除的默认构造函数)。
这是我的例子:
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_
,这些成员也没有 in-class 初始值设定项,但没有调用它们的构造函数!所以:
union
的成员数据是否在构造函数初始化列表中被默认初始化?谢谢!
So as you can see: the union U didn't initialize its member data a_ and i_
一个联合只有一个成员处于活动状态,因此永远不会出现两个成员可以被初始化的情况。
如果您不在用户定义的构造函数中提供初始化程序,则不会初始化任何联合成员。
联合只是一个位置的多个名称(引用)
无论修改哪个成员,都只会处理一个位置
因此所有其他成员都将被修改
union _Union{
int i; // 4 bytes.
long ll; // 4 bytes.
float f; // 4 bytes.
char*txt; // 4 bytes.
};
sizeof(_Union) = 4 bytes
如果结构大小为 16 字节
联合的大小是最大成员的大小
如果上面 _Union
有另一个 long long int
成员那么它的大小将是 8 个字节
因为 long long int
是 8