static静态成员
1.static静态数据成员可以被该类所有对象所共享,但其不是每个对象中的成员。
2.static静态成员在类中声明之后,还必须要在类的外面定义一次,而且还要用
类名进行限定修饰。
class Account{
public:
static double rate;
}
double Account::rate=0.12;//必须在类的定义之外再定义
3.静态数据成员的定义不应该放在类声明的头文件中,例如上例中class Account
头文件中,则静态成员的定义应该这样写:
#include“account.h”
double Account::rate=0.12;//在包含类的费内联成员函数定义的文件中
4.一般的静态数据成员的定义都应放在类的定义之外,但是如果静态数据成员是整型
const static成员,则通常在定义时就初始化(初始化时必须要是一个常量表达式)。
class Account {
public :
const static int namesize=16;
const static string name[namesize];
}
const int Account::namesize;//仍然需要在类的外面定义,只是初始化放在类里面
const string Account::name[namesize]="马化腾";
本例中,在定义name时直接用了namesize,而并没有在namesize之前用Account限定
说明他是Account的成员,是因为在定义name时,前面有了Account修饰了,这样name
的作用域已经在Account类里面了,所以他可以直接调用namesize成员。
5.静态数据成员的访问除了和一般数据成员的访问相同外,还支持用类名限定修饰的名字来
直接访问
if(Account::namesize==16)
{。。。。。。}
6.静态数据成员的类型可以是所属的类类型,而非static成员则只能是自身类的指针或引用!
class Bar{
public:
static Bar mem1;//ok
Bar *mem2;// ok
Bar mem3; //error
};
7.static数据成员可以作为类成员函数的缺省实参,而非static成员则不可以。
class Screen{
public:
Screen&clear(char=bkground);
private:
static const char bkground='#';
}
非static数据成员不能用作默认实参,因为他的值不能独立与所属的对象而使用。
使用非static数据成员作默认实参,将无法提供对象以获取该成员的值,因而是错误的。
8.静态成员函数 的声明除了在类体中的函数声明前加上关键字static, 以及不能声明为
const 或volatile之外,与非静态成员函数相同。出现在类体外的函数定义不能指定关
键字static。
9.静态成员函数没有this指针,任何显式或隐式的调用this指针都是错误的,例如一个static
成员函数中调用了一个非static数据成员都是错误的,因为在调用非static时会隐式的调用
当前对象的this指针,而这个是不允许的。