当前位置: 首页 > 知识库问答 >
问题:

为什么未初始化联合成员数据默认值?

殷烨
2023-03-14

AFAIK在构造函数初始值设定项列表中不初始化其成员数据的类/结构/联合,那么它们是默认初始化的。如果成员数据是内置整数类型,则其值不确定。如果它是类类型,则调用其默认ctor(需要可访问且未删除的默认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()
  • 这样,构造函数不会显式初始化其ctor init列表中的成员d和a,因此它们是默认init<代码>d_有一个未定义的值。而a_是默认初始化

在这里之前,我很好,但是工会的成员呢

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()
  • 如您所见:联合U没有在其ctor-init-list中初始化其成员数据a_i_,这些成员也没有类内初始化器,但它们的构造函数都没有被调用!所以:

在构造函数初始值设定项列表中,联合的成员数据是否默认初始化?非常感谢。

共有2个答案

刘胜泫
2023-03-14

一个联合只是一个位置的多个名称(引用)
无论您修改哪个成员,都只有一个位置被寻址
因此所有其他成员都将被修改

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

寇甫
2023-03-14

如您所见:联合U没有初始化其成员数据a_和i_

一个工会只有一个活跃成员,因此从来没有两个成员可以初始化的情况。

如果未在用户定义的构造函数中提供初始化器,则不会初始化联合的成员。

 类似资料:
  • 如果我有一个struct Foo和一个struct Bar: 如果我初始化一个条并打印正确得到的值: 但是现在如果我声明这样的构造函数: 我失去了Bar::foo的默认构造,程序输出了32764 0 5! 为什么我不得不像这样无声地初始化每个成员变量: 只要我声明一个构造函数?在这种情况下,为什么默认构造不起作用?

  • 我在Visual Studio2019中有一个Xamarin表单解决方案。我现在只使用Android版本。完整的错误是: 在此进程中,java.lang.IllegalStateException Message=Default FirebaseApp未初始化AppCardView.Sample.android。确保首先调用FirebaseApp.InitializeApp(上下文)。 在我的An

  • 问题内容: 所以我要声明并初始化一个int数组: 说我改为这样做… … 0将按标准输出。另外,如果我这样做: 将按标准输出。那么默认如何初始化我的数组?是否可以安全地假设默认的初始化将数组索引设置为零,这意味着我不必遍历数组并对其进行初始化? 问题答案: Java程序中未由程序员明确设置为所有内容的所有内容都初始化为零值。 对于的引用(任何包含对象的内容)。 对于int / short / byt

  • 考虑以下代码 VS2013编译器发出以下警告: 警告C4351:新行为:数组“B::member”的元素将默认初始化1 这里有记载 使用C 11,并应用“默认初始化”的概念,意味着B. part的元素将不会被初始化。 但我认为,成员{}应该执行值初始化,而不是默认初始化。VS2013编译器是否损坏? 8.5美元/6 默认初始化类型为T的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则

  • 问题内容: 默认构造函数和直接初始化对象的字段之间有什么区别? 有什么原因要偏爱以下示例之一? 例子1 例子2 问题答案: 初始化程序在构造函数主体之前执行。(如果你同时具有初始化程序和构造函数,则会产生影响,构造函数代码将第二次执行并覆盖初始化值) 当你始终需要相同的初始值(例如,在你的示例中为给定大小的数组或特定值的整数)时,初始化器是很好的选择,但是它可以对你有利或不利于你: 如果你有许多构

  • 问题内容: 我最近刚与Python中的一个错误作斗争。那是那些愚蠢的新手错误之一,但是它让我思考了Python的机制(我是C ++的老程序员,是Python的新手)。我将列出错误的代码并解释如何解决该问题,然后我有两个问题。 场景:我有一个叫做A的类,它有一个字典数据成员,下面是其代码(当然这是简化的): 使用此代码的类为B类: 请注意,每次调用都会初始化类A的新“干净”实例,并在添加前后打印字典