C++之aggregate type详解

2014-11-24 13:09:00 · 作者: · 浏览: 2
在对C 的一些形式化描述里面看到过这个说法, 比如C standards中, 原以为只是生造概念而已, 在Generic Programming and STL中, 看到对这个概念的精确定义, 以及特定的语言特性与这个概念的关联:
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}; // 合法