[英]Why should I initialize static class variables in C++?
在C和C ++中,所有靜態變量默認初始化為ZERO。
這不是靜態類數據成員的情況。 這是為什么?
#include <iostream>
using namespace std;
int var;
class MyClass
{
public:
static int classVar;
};
int MyClass::classVar = 0; // Why I have to init it here?
int main(void)
{
cout << ::var << endl; // this is initalized to ZERO by default
static int var;
cout << var << endl; // and this also is initalized to Zero
cout << MyClass::classVar << endl;
return 0;
}
在課堂范圍內,
int MyClass::classVar = 0; // Why I have to init it here?
是一個定義和
static int classVar;
是宣言 ,即。 保證變量將在某處定義 :您必須准確定義一次您聲明的變量。
基本原理是類聲明可能包含在多個源文件中。 它的一部分是一個定義,它會發生多次:這是錯誤的(例外是內聯[成員]函數)。
請注意,根據值初始化規則,您可以相處
int MyClass::classVar; // Zero-initialized !
作為一個定義。
在命名空間范圍內聲明的變量也是定義(除非它們是extern
限定的):
int var;
是一個聲明和一個定義:如果你把它放在一個標題中並將它包含在多個翻譯單元中,你就會出現錯誤(“多重定義的符號”,或者沿着那些行的東西)。
[注意,在C ++中(而不是在C中),如果上面的var
是const
,它將自動變為static
並且如果將其放入包含多個的頭中,則不會違反單定義規則。 這有點偏離主題,但隨意詢問細節]
C ++ FAQ 10.12聲明:
必須在一個編譯單元中顯式定義靜態數據成員。
來自C ++ FAQ http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12
這是回答你的問題,還是在你提到C ++標准之后?
您必須初始化靜態類數據變量,因為您必須告訴編譯器它們的值是什么。 類不需要具有默認值的概念。
變量類型具有邏輯“零值”,對於int
它為0,對於double
0.0,對於string
“”等。相反,類不一定具有默認值。 考慮一下,例如class Rectangle
。 它的零值是什么 - 零方塊的矩形或單位邊長的矩形? 對於靜態變量,編譯器會要求您自己定義靜態變量必須具有的值,因為並非每種數據類型都可以通過默認值進行初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.