集合类
集合类是的用户可以直接发放稳其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我饿么说它是聚合的:
- 所有成员都是public的
- 没有定义任何构造函数。
- 没有类内初始值
- 没有基类,也没有virtual函数
例如,下面的类是一个聚合类:
struct Data{
int ival;
string s;
};
Data vall = {0, "Anna"};
值得注意的是,显示的初始化对象成员存在三个明显的缺点:
- 要求类的所有成员都是public的。
- 将正确初始化每个对象的成员的重任交给类的用户。
- 增加一个删除一个成员,所有的初始化语句都需要更新。
类的静态成员
有的时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象相关联。我们通过在成员函数的声明之前加上关键字static使得其与类关联在一起。
静态成员可以使public或private的。
静态数据成员类型可以使常亮、引用、指针、类类型等。
class A
{
public:
void calculate(){a=+a*i;}
static double r(){return i;}
static void r(double);
private:
std::string o;
double a;
static double i;
static double i();
};
每个A对象包含两个数据成员:o和a。只存在一个i对象而且它被所有A对象共享。
类似的,静态成员函数也不和任何对象绑定到一起。作为结果,静态成员函数不能生命成const的。
-
使用类的静态成员
使用作用于运算符直接访问静态成员:
double r;
r=A::r();//使用作用于运算符访问静态成员
可以利用指针,引用来访问静态成员
A ac1;
A *ac2=&ac1;
double r;
r=ac1.r();
r=ac2->r();
成员函数不用通过作作用域就能直接使用静态成员:
class A{
public:
void c(){a+=a*i;}
private:
static double i;
};
静态数据成员不是由类的构造函数初始化的。我们不能再累的内部初始化静态数据成员。
必须在类的外部定义和初始化每个静态成员。且只能定义一次。
double A::i=i();
特别的静态数据成员的类型可以就是它所属的类类型。而非静态数据成员则受到限制。只能声明它所属的指针或引用:
class Bar{
public:
private:
static Bar meml;//正确:静态成员可以是不完全类型
Bar *mem2;//正确:指针成员可以是不完全类型
Bar mem3;//错误:数据成员必须是完全类型
};
静态成员和普通成员硬外一个区别是可以使用静态成员作为默认实参
class Screen{
public:
Screen& clear(char = bkground);
private:
static const char bkground;
};
网友评论