計算機二級C++基礎(chǔ):全局對象的作用

字號:

盡管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的初始化。