簡體   English   中英

為什么要在C ++中初始化靜態類變量?

[英]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中),如果上面的varconst ,它將自動變為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM