聚合类
聚合类使得用户可以直接访问其成员, 并且具有特殊的初始化语法形式,当一个类满足如下条件时,我们说它是聚合的.
* 所有成员都是public的.
* 没有定义任何构造函数
* 没有类内初始值
* 没有基类,也没有virtual函数.
struct Data{
int val;
string s;
};
可以提供一个花括号括起来的成员初始值列表初始化聚合类的数据成员.
Data vall;
vall.val-=0,vall.s=string("yang");
或者
Data va={1,"yang"}; //顺序必须和类内声明的顺序相同,如果初始值列表中的元素个数小于类的成员数量,则靠后的被值初始化.
字面值常量类
constexpr函数的参数和返回值必须是字面值类型,某些类也是字面值类型;
字面值类型的类可能含有constexpr函数成员,这样的成员必须符合constexpr函数的所有要求,它们隐式是const的.数据成员都是字面值的聚合类是字面值常量类;
如果一个类不是聚合类,满足下面要求,也是字面值类:
* 数据成员必须是字面值类型.
* 类必须至少含有一个constexpr构造函数.
* 如果一个数据成员含有类内初始值,则内置类型成员的初始值必须是一条常量表达式;或者如果成员属于某种类型,则初始值必须使用成员自己的constecpr构造函数.
* 类鼻祖使用析构函数的默认定义。
一般的构造函数不能是coonst的,但字面常量类的构造函数可以是constexpr函数,一个字面值常量类至少提供一个constexpr构造函数.
7.6类的静态成员
在成员前加关键字static使其与类关联在一起。静态成员可以是任何类型;
静态成员函数不与任何对象绑定在一起,它们不包含this 指针,静态成员函数不能申明为const ,而且我们不能在static函数体内使用this指针;
成员函数不需要通过作用域运算符可以直接使用静态成员.
定义静态成员函数
在外部定义时,不需要重复static关键字.
关键字只出现在类内额申明语句.
一般不在类的内部初始化静态成员.必须在类的外部定义初始化每个静态成员. 要想在类内初始化,类型必须是constexpr类型的: static constexpr int period = 30;
如果想在别的函数中用到静态成员,必须在类外定义(就算有类内初始值也不行);
静态数据成员的类型可以是它所属的类的类型,但普通成员只能申明成它所属类的指针或引用;举个例子
calss Bar{
public:
....
private:
stdtic Bar mem; // 可以是不完全类型;
Bar *mem2;
Bar mem3; //错误,数据成员必须是完全类型;
};
静态成员可以作为默认实参,普通成员不行.