盡管C++允許在類的外部聲明全局對象,但是將全局對象聲明為一些類的靜態(tài)數(shù)據(jù)成員,在類塊的protected:里聲明靜態(tài)數(shù)據(jù)成員,如果需要,可以用public:靜態(tài)數(shù)據(jù)成員來提供get,用procteted:靜態(tài)數(shù)據(jù)成員提供set。
例如:考慮當(dāng)前存在的Car對象的數(shù)目,既然讓每一個Car對象都去計算Car對象的數(shù)目是很繁雜的,就不如把這個值存儲為全局變量,也就是說,一個靜態(tài)的Car類成員,既然額外的用戶可能需要得到Car對象的數(shù)目。就應(yīng)當(dāng)用一個公有的靜態(tài)成員函數(shù)去得到數(shù)目,但是既然不是讓每一個能改變這個變量的值,就應(yīng)當(dāng)不是一個public:靜態(tài)成員函數(shù)來設(shè)置Car對象的數(shù)目,下面的演示了靜態(tài)數(shù)據(jù)成員和public:靜態(tài)訪問成員函數(shù)。
#include
using namespace std;
class Car {
public:
Car();
~Car();
Car(const Car& c);
static int num(); <-- 1
protected:
static int num_; <-- 2
};
Car::Car()
{
++num_;
}
Car::~Car()
{
--num_;
}
int Car::num()
{
return num_;
}
int Car::num_ = 0; <-- 3
(1) 訪問num_成員函數(shù)
(2) 聲明靜態(tài)數(shù)據(jù)成員
(3) 定義靜態(tài)數(shù)據(jù)成員
注意:靜態(tài)數(shù)據(jù)成員必須被定義在源文件內(nèi)如果忘了定義靜態(tài)數(shù)據(jù)成員,通常會產(chǎn)生一個C++錯誤,它的特定是鏈接時的錯誤消息。例如,靜態(tài)成員Car::num_可能被定義在與類Car相關(guān)的文件里,例如Car.cpp.
不象普通的數(shù)據(jù)成員,在類的第一個對象創(chuàng)建之前可以訪問靜態(tài)數(shù)據(jù)成員,例如,在第一個Car對象被創(chuàng)建之前可以去訪問靜態(tài)數(shù)據(jù)成員Car::num_,下面是main()程序的展示:
int main()
{
cout << "Before creating any cars, num() returns "
<< Car::num() << "\n";
Car a, b, c;
cout << "After creating three cars, num() returns "
<< Car::num() << "\n";
}
用用戶定義的類定義靜態(tài)數(shù)據(jù)成員也是允許的,如果存在某種Car對象的注冊,例如,有一些種類的Car對象注冊如果注冊是一個全局變量,將注冊定義為類的靜態(tài)數(shù)據(jù)成員,這類似于靜態(tài)int數(shù)據(jù)成員,只需要用registry的類型替換int類型,并且替換初始化的"=0;"改用registry的初始化。
例如:考慮當(dāng)前存在的Car對象的數(shù)目,既然讓每一個Car對象都去計算Car對象的數(shù)目是很繁雜的,就不如把這個值存儲為全局變量,也就是說,一個靜態(tài)的Car類成員,既然額外的用戶可能需要得到Car對象的數(shù)目。就應(yīng)當(dāng)用一個公有的靜態(tài)成員函數(shù)去得到數(shù)目,但是既然不是讓每一個能改變這個變量的值,就應(yīng)當(dāng)不是一個public:靜態(tài)成員函數(shù)來設(shè)置Car對象的數(shù)目,下面的演示了靜態(tài)數(shù)據(jù)成員和public:靜態(tài)訪問成員函數(shù)。
#include
using namespace std;
class Car {
public:
Car();
~Car();
Car(const Car& c);
static int num(); <-- 1
protected:
static int num_; <-- 2
};
Car::Car()
{
++num_;
}
Car::~Car()
{
--num_;
}
int Car::num()
{
return num_;
}
int Car::num_ = 0; <-- 3
(1) 訪問num_成員函數(shù)
(2) 聲明靜態(tài)數(shù)據(jù)成員
(3) 定義靜態(tài)數(shù)據(jù)成員
注意:靜態(tài)數(shù)據(jù)成員必須被定義在源文件內(nèi)如果忘了定義靜態(tài)數(shù)據(jù)成員,通常會產(chǎn)生一個C++錯誤,它的特定是鏈接時的錯誤消息。例如,靜態(tài)成員Car::num_可能被定義在與類Car相關(guān)的文件里,例如Car.cpp.
不象普通的數(shù)據(jù)成員,在類的第一個對象創(chuàng)建之前可以訪問靜態(tài)數(shù)據(jù)成員,例如,在第一個Car對象被創(chuàng)建之前可以去訪問靜態(tài)數(shù)據(jù)成員Car::num_,下面是main()程序的展示:
int main()
{
cout << "Before creating any cars, num() returns "
<< Car::num() << "\n";
Car a, b, c;
cout << "After creating three cars, num() returns "
<< Car::num() << "\n";
}
用用戶定義的類定義靜態(tài)數(shù)據(jù)成員也是允許的,如果存在某種Car對象的注冊,例如,有一些種類的Car對象注冊如果注冊是一個全局變量,將注冊定義為類的靜態(tài)數(shù)據(jù)成員,這類似于靜態(tài)int數(shù)據(jù)成員,只需要用registry的類型替換int類型,并且替換初始化的"=0;"改用registry的初始化。