Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315287
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: C/C++

2009-08-21 14:58:39

在对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}; // 合法
阅读(1831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~