一、什么是聚合体呢?
英文表述为Aggregate, 从MSDN上找到的定义如下:
An aggregate type is an array, class, or structure type which:
-
Has no constructors
-
Has no nonpublic members
-
Has no base classes
-
Has no virtual functions
http://msdn.microsoft.com/en-us/library/sdwe79a4.aspx
另外,MSDN 告诉我们一个聚合体是可以通过{}这种方式来初始化的。
而我们知道c语言里struct是能用{}这种方式来初始化的,而且是完全符合Aggregate的上述定义的。所以,我们可以得出一个结论,c语言里struct的行为就是一个Aggregate的行为。所以,c++中只要class和struct也象c语言里struct一样,满足成为一个Aggregate的条件,即能通过{}这种方式来初始化(不调用构造函数)。
二、举例说明
1>例1struct Node
{
int a;
int b
};
struct Node node = {1,2}; ----编译correct,因为此例子就是一个Aggregate
VS2010里,通过“Ctrl + Alt + D”即可进入到c++代码和汇编的混合代码,查看汇编代码可知确实是没有调用struct的构造函数。
class Test
{
public:
Test() {};
private:
int a;
};
struct Node
{
int a;
int b;
Test c;
};
struct Node node = {1,2}; -----编译correct, 因为此例子struct Node是一个Aggregate。
3>例3
class Test
{
public:
int a;
};
struct Node
{
int a;
int b;
Test c;
};
struct Node node = {1,2}; -----编译correct, struct Node是一个Aggregate
4>例4
class Test
{
private:
int a;
};
Test m = {1} -------编译incorrect,因为int a不是public的,故class Test不是一个Aggregate
5>例5
class Test
{
Test() { }
public:
int a;
};
Test m = {1} -------编译incorrect,因为Test有自定义的构造函数,故class Test不是一个Aggregate