c++--类的静态成员

类的静态成员(static)

有时候,类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。

声明静态成员

可以使public/private的,类型可以使常量、引用、指针、类类型等。

class Account
{
public:
    void calculate(){amount+=amount*interestRate;}
    /*静态成员函数*/
    static double rate(){return interestRate;}
    static void rate(double);
private:
    std::string owner;
    double amount;
    /*静态数据成员*/
    static double interestRate;
    static double initRate();
};

对象中不包含任何与静态数据成员有关的数据。因此,每个Account对象将包含两个数据成员:owner和amount。只存在一个interestRate成员,而且它被所有Account对象共享。
类似的,静态成员函数也不与任何对象绑定在一起,他们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们不能再static函数体内使用this指针。

使用类的静态成员

double r;
r=Account::rate();     //使用作用域运算符访问静态成员
/********************************************/
Account ac1;
Account *ac2=&ac1;
r=ac1.rate();           //通过Accountd 的对象或引用访问
r=ac2->rate();        //通过指向Account 对象的指针访问

虽然静态成员不属于类的某个对象,但仍然可以使用类的对象、引用或者指针来访问静态成员。
成员函数不用通过作用域运算符就能直接使用静态成员(把静态成员看做类内成员就行)。

定义类静态成员(static关键字只出现在类内部声明)

静态成员函数:定义可内可外,外部不写static,外部必须有作用域运算符(和定义在外部的普通成员函数一样)

静态数据成员:定义在外,外部不写static,外部必须有作用域运算符

/*静态成员函数定义*/
void Acount::rate(double newRate)
{
    interestRate=newRate;
}
/*静态数据成员定义并初始化*/
double Account::interestRate=initRate();   //注意作用域运算符不能忘

类似全局变量,静态数据成员定义在任何函数之外。一旦定义,就一直存在于程序的整个生命周期中。

静态成员的类内初始化??

通常,类的静态成员不应该在类的内部初始化。然而,可以为静态成员提供const整数类型的类内初始值,不过要求静态成员必须是字面值常量类型的constexpr.

class Account
{
...
private:
    static constexpr int period=30;
    double daily_tbl[period];
};

//一个不带初始值的静态成员的定义
constexpr int Account::period;      //初始值在类的定义内提供

即使一个常量静态成员在类内部被初始哈了,通常情况下也应该在类的外部定义一下该成员。

静态成员能用于某些场景,而普通成员不能

1.静态数据成员可以使不完全类型。特别的,静态数据成员的类型可以使它所属的类类型。

2.可以使用静态数据成员作为默认实参。

class Screen
{
public:
    //bk表示一个在类中稍后定义的静态成员
    Screen& clear(char=bk);
private:
    static Screen mem;     //不完全类型Screen
    static const char bk;    //bk可作为默认实参
};

 

posted @ 2017-06-13 18:04  halo_vagabond  阅读(511)  评论(0编辑  收藏  举报