class Test {
public:
int ia [3];
int x;
} t= { {1, 2, },4 };
以上的类定义, 竟然可以用类似C语言中对结构的初始化. 并非每一个类都可以这样, 正是aggregate type才能如此, 它要求几个条件:
1. 不能出现任何一个使用者显式声明的constructor(因为C++在概念上总会为类造出默认构造函数, 所以强调使用者显式声明的)
2. 不能有任何 private或 protected数据成员, 但可以有这样的成员函数, 这并不意味着数据成员之前不能出现这两个关键字, 比如如下冗余的不起作用的private 就不影响类型是aggregate type:
class T {
private: public: // 有private: 但没起到作用
int x;
};
3. 不能拥有virtual 成员函数(非virtual成员函数是允许的), 也不得以拥有base class. 这一条是该书中没有提到的, 毕竟程序员没办法指定vtbl应该如何声明.
VC2008对指定了基类的准aggregate type给出了这样的错误信息:
Types with a base are not aggregate
对声明了虚函数(尽管未定义)错误信息是:
Types with virtual member functions or virtual bases are not aggregate
容易疑惑的是, aggregate type允许类拥有定义者显式声明的destructor, 也允许显式调用dtor.
看似这个 aggregate type与POD类型并没有太大关系.
对aggregate type的初始化语法中, 概念上应该以嵌套的{}指定的内容, 如果所有元素都显式指定, 可以去掉嵌套的{}, 如
class Test {
public:
int ia [3];
int x;
} t= { {1, 2, 3},4 };
也可为
t = { 1, 2, 3, 4};
只有嵌套的{}中有剩余的未初始化的元素时, 才必需使用嵌套的{}:
t = { {1, 2, }, 4};
注意在初始化语法中, 向来可以在最后一个元素有一个额外的逗号, 即使后面已没有更多的元素可以指定时( t = { {1,2,3,}, 4, };)
在嵌套的{}中指定空元素是合法的(但不允许再有一个逗号)
t = { {}, 4}; // 合法