1、static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。
2、在成员申明前加上关键字static将成员设为static。static成员遵循正常的共有/私有访问规则。
class Account {
public:
void applyint() {amount += amount * interestRate;}
static double rate() {return interestRate;}
static void rate(double);//set a new rate
private:
sth::string owner;
double amount;
static double interestRate;
static double initRate();
};
3、static成员函数可以定义在类的内部,也可以定义在类的外部定义,在类的外部定义static成员时,无须重复指定static保留字,该保留字只出现在类定义体内部的申明处:
void Account::rate(double newRate)
{
interestRate = newRate;
}
4、可以通过作用域操作符从类直接调用static成员,或者通过对象、引用或者指向该类类型对象的指针间接调用。
Account ac1;
Account *ac2 = &ac1;
double rate;
rate = ac1.rate();
rate = ac2->rate();
rate = Account::rate();
5、像使用其他成员一样,类成员函数可以不用作用域操作符来引用类的static成员。
void applyint() {amount += amount * interestRate;}
6、因为static成员不是任何对象的组成部分,所以static成员函数不能被申明为const,也不能被申明为虚函数。
7、static数据成员必须在类定义体的外部定义。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。一般将static数据成员的定义放在包含类的非内联成员函数定义的文件中。 注意:尽管initRate时私有的,我们仍然可以使用该函数来初始化interestRate。像任意的其他成员定义一样,interestRate的定义是在类的作用域中,因此可以访问该类的私有成员。
//定义和初始化静态成员
double Account::interestRate = inintRate();
8、特殊的const static数据成员可以在类的定义体中进行初始化,但仍必须在类的定义体之外进行定义,只是不必再指定初始值。
class Account {
public:
static double rate() {return interestRate;}
static void rate(double);//set a new rate
private:
static const int period = 30;
double daily_tb1[period]; //ok:period is constant expression
};
const int Account::period; //在类内部提供初始化式后,外部定义不用指定初始值
9、static数据成员的类型可以是该成员所属的类类型。非static成员被限定申明为其自身类对象的指针或引用:
class Bar {
public:
// ...
private:
static Bar men1; // ok Bar *mem2;
Bar *mem2; // ok Bar mem3;
Bar mem3; // error
};
10、static数据成员可用作默认实参:
class Screen {
public:
Screen& clear(char = bkground);
private:
static const char bkground = ‘#’;
};
11、类模板的static成员,类模板可以像其他类一样申明static成员,static数据成员的定义必须指出它是类模板的成员,如:
template <class T>
class Foo {
public:
static std::size_t count() {return ctr;}
//其他接口成员
private:
static sdt::size_t ctr;
//其他成员
};
template <class T>
size_t Foo<T>::ctr = 0;