具有用户定义构造函数的非聚合类的值初始化

时间:2012-09-26 06:55:59

标签: c++

我正在审议这个问题:Aggregates and pods 当C ++中的类具有用户定义的默认构造函数时,只有一些数据成员被初始化,其余的数据成员是否会被初始化? 以下是我尝试的程序导致编译错误:

#include <iostream>
using namespace std;

class A {
public:
    A() {
        i=10;
        f = 10.0f;
        c = 45;
        d = 10.0;
    }

    void show() {
        cout << i << "\t" << f << "\t" << c << "\t" << d<<"\n";
    }

private:
    int i;
    float f;
    char c;
    double d;
};

int main() {
    A a={20,20.0f};
    a.show();
}

2 个答案:

答案 0 :(得分:3)

您的类不符合聚合条件,因为它有private个非静态数据成员。

  

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),非静态数据成员(9.2)没有大括号或相等的初始值,没有私有或受保护非静态数据成员(第11条),没有基类(第10条),也没有虚函数(10.3)。

编辑:

  

对于非聚合类的对象,如果只初始化了一些数据成员,其余的值是否会初始化(赋值为0)?

规则在:

中指定

C ++ 11 8.5.4列表初始化[dcl.init.list]第3段:

  

对象或类型T的引用的列表初始化定义如下:
   - 如果初始化列表没有元素且T是具有默认构造函数的类类型,则该对象是值初始化的。
   - 否则,如果T是聚合,则执行聚合初始化(8.5.1)    - 否则,如果T是std :: initializer_list的特化,则如下所述构造initializer_list对象,并根据相同类型的类(8.5)初始化对象的规则初始化对象。 />    - 否则,如果T是类类型,则考虑构造函数。枚举适用的构造函数,并通过重载决策(13.3,13.3.1.7)选择最佳构造函数。如果转换任何参数需要缩小转换(见下文),则程序格式不正确    - 否则,如果T是引用类型,则由T引用的类型的prvalue临时值被列表初始化,并且引用绑定到该临时值。 [注意:像往常一样,如果引用类型是非const类型的左值引用,则绑定将失败并且程序格式错误。 - 注意事项]
   - 否则,如果初始化列表具有单个元素,则从该元素初始化对象或引用;如果需要缩小转换(见下文)将元素转换为T,则程序格式不正确    - 否则,如果初始化列表没有元素,则对象进行值初始化    - 否则,该程序格式不正确。

您的计划不属于所提及的任何情况,因此属于形成不良的情况。

答案 1 :(得分:0)

你必须用4个参数声明构造函数,比如

A(int i = 10, float f = 10.0f, int c = 45, float d = 10.0f):
i(i), f(f), c(c), d(d)
{

}

现在您可以使用大括号

初始化变量