首页 > 解决方案 > 为什么类型变量;不调用默认ctor?

问题描述

让我们假设以下类 Foo。

struct Foo
{
  int i;
  bool j;
};

为什么我从以下几行得到不同的结果?

int main(void)
{
    //I thought the default constructor would be called
    Foo foo1;
    cout << foo1.i << " : " << foo1.j << endl; // " 4196352 : 0 " --> ctor not called?

    //if calling the default constructor explicitly
    foo1 = Foo(); 
    cout << foo1.i << " : " << foo1.j << endl; // " 0 : 0" --> ctor called.
}

不应该隐式调用默认的ctor吗?

根据cpp参考

如果没有为类类型(结构、类或联合)提供任何类型的用户声明的构造函数,编译器将始终将默认构造函数声明为其类的内联公共成员。

标签: c++classconstructordefault-constructor

解决方案


根据 C++ 标准

隐式定义的默认构造函数执行类的一组初始化,这些初始化将由用户编写的该类的默认构造函数执行,没有 ctor-nitializer (15.6.2) 和空的复合语句

该类有一个不初始化类成员的普通默认收缩器。因此它们具有不确定的值。

这种形式的构造函数调用

Foo()

value 初始化数据成员。对于基本类型,这意味着零初始化。


推荐阅读