首先靜態成員可以是public的,也可以是private的,只需在一般的變量、函數聲明語句前加上static關鍵字即可聲明一個static變量。
類中的靜態成員存在與任何對象之外,所有該類對象的共享一個static成員。
靜態成員對象不與任何對象綁定在一起,包括this指針。靜態成員函數不能聲明為const的,也不能在static函數體中使用this指針。
可以直接使用作用與運算符訪問靜態成員,同時可以通過類的對象,引用或者指針來訪問static成員,盡管它們有時是private成員。成員函數可以直接使用static成員。
類的靜態成員函數可以在類的內部或外部定義,當在外部定義時,不能重復關鍵字static。但類的靜態成員變量必須在外部定義和初始化,且在任何函數之外,一個靜態數據成員只能定義一次。
class Account { public: Account() = default; Account(const std::string &s, double amt): owner(s), amount(amt) { } void calculate() { amount += amount * interestRate; } double balance() { return amount; } public: static double rate() { return interestRate; } static void rate(double); private: std::string owner; double amount = 0.0; static double interestRate; static double initRate() { return .0225; } static const std::string accountType; static constexpr int period = 30;// period is a constant expression double daily_tbl[period]; }; const string Account::accountType("Savings Account"); double Account::interestRate = initRate();//在類以及任何函數之外定義static成員,以及類名之后的部分屬於類的作用域之內,因此可以直接使用initRate函數。 void Account::rate(double newRate) { interestRate = newRate; }
注意:雖然interestRate在類內部已經聲明,但必須要在類外部定義后,才能使用它!
然而,例外的是,我們可以為靜態成員提供const整數類型的類內初始值,但要求該靜態成員必須是字面值常量constexpr。