2016-02-24 76 views
3

這是一個從geeksforgeeks中獲取的例子。我不明白以下代碼。如何在C++類模板中使用靜態變量

template<class T> int Test<T>::count = 0; 

是計數外部變量嗎?爲什麼不讓靜態int count = 0? 下面列出了geeksforgeeks中的描述和代碼。

類模板和靜態變量:對於類模板的規則是 相同函數模板類模板的每個實例都有 其成員靜態變量的自己的副本。例如,在下面的 程序中有兩個實例Test和Test。因此存在兩個靜態副本 變量計數。

#include <iostream> 

using namespace std; 

template <class T> class Test 
{ 
private: 
    T val; 
public: 
    static int count; 
    Test() 
    { 
    count++; 
    } 
    // some other stuff in class 
}; 

template<class T> 
int Test<T>::count = 0; 

int main() 
{ 
    Test<int> a; // value of count for Test<int> is 1 now 
    Test<int> b; // value of count for Test<int> is 2 now 
    Test<double> c; // value of count for Test<double> is 1 now 
    cout << Test<int>::count << endl; // prints 2 
    cout << Test<double>::count << endl; //prints 1 

    getchar(); 
    return 0; 
} 

回答

2

實例化檢測對象與新型每當這時,從現有的模板創建新類爲您創建。 (所以在你的情況下,編譯器會根據你的需求創建Test<int>Test<double>類)。您現在可以將Test<int>Test<double>想象爲從相同模板創建的2個獨立類。

因爲有兩個類,所以在不同的作用域中有兩個具有相同名稱的靜態變量副本。 template<class T> int Test<T>::count = 0;是根據需要創建的類中定義此count的模板。

如果你擅長這個定義對於一些類型,例如:

template<> 
int Test<int>::count = 5; 

Test<int>::count7在印刷它的時間。而Test<double>::count將保持1(不變)。

1

count不是外部變量。這種類之外的原因是因爲變量需要被分配(並且可能被實例化)。當一個靜態變量位於類定義中時,它只會告訴編譯器「將會有這種類型的變量」,但由於定義可能包含在許多源文件中,因此編譯器不會執行任何分配。

當編譯器看到外部定義時,它知道爲它分配空間並在它是一個對象時將其實例化。這可能只發生一次,所以它不能在頭文件中。

1

Class Test是一個模板類,這意味着編譯器每次遇到用不同類型實例化Test的代碼時都會生成不同的代碼。

計數不是外部變量;它是一個靜態變量。

有一個由其容器類的所有實例共享的靜態變量實例。

這裏的扭曲是Test是一個模板類,所以實際上並不只有一個「class Test」。有兩個:main()函數將導致編譯器生成「class Test」和「class Test」。

如前所述,靜態變量由其容器類的所有實例共享。另外還指出,有兩種生成的類Test(int和double)。由於count是一個靜態變量,這意味着需要每個類型的一個實例 Test。因此,編譯器會生成兩個:

int Test<int>::count = 0; 

int Test<double>::count = 0; 

記住模板的目的是讓你編寫代碼一次,依靠編譯器爲所有不同的數據類型生成代碼爲此使用該模板。