我正在审议这个问题: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();
}
答案 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)
{
}
现在您可以使用大括号
初始化变量