簡體   English   中英

為什么可以初始化非const和靜態const成員變量而不是靜態成員變量?

[英]Why can one initialize non-const and static const member variables but not static member variables?

struct A
{
    int a = 5;               //OK
    const int b = 5;         //OK 
    static const int c = 5;  //OK 
    static int d = 5;        //Error!
} 



error: ISO C++ forbids in-class initialization of non-const static member 'A::d'

為什么會這樣? 有人可以向我解釋這背后的原因嗎?

它與數據的存儲位置有關。 這是一個細分:

  • int:成員變量,存儲在存儲類實例的任何位置
  • const int:與int相同
  • static const int:不需要存儲,它可以簡單地“內聯”使用
  • static int:這必須在程序中有一個存儲位置......在哪里?

由於static int是可變的,因此必須將其存儲在某個地方的實際位置,以便程序的一部分可以修改它,而另一部分可以看到該修改。 但它不能存儲在類實例中,因此它必須更像是一個全局變量。 那么為什么不把它變成一個全局變量呢? 那么,類聲明通常在頭文件中,並且頭文件可以在多個翻譯單元(.cpp文件)中包含#included。 所以有效的頭文件說“有一個int ......某處。” 但是存儲需要放入相應的.cpp文件中(就像全局變量一樣)。

最后,這不是真正的初始化,而是存儲。 您可以不使用初始化程序,在將此文件添加到.cpp文件之前,您仍然沒有有效的程序:

int A::d; // initialize if you want to, default is zero

如果沒有這個,靜態int的引用將是未定義的,鏈接將失敗。

靜態const成員變量的初始化可用於整數和枚舉類型。 自第一語言標准(C ++ 98)以來,此功能已存在於C ++中。 需要在整數常量表達式 (即編譯時常量)中使用靜態const成員,這是該語言的一個重要特性。 積分和枚舉類型被挑選出來並以這種特殊方式處理的原因是積分常量通常用在編譯時上下文中,它不需要常量的存儲(沒有定義)。

為非靜態成員提供初始化程序的能力是一種新的(對於C ++ 11)功能。 這是一個完全不同的功能,即使它在語法級別看起來相似。 這些初始值設定項用作未由用戶顯式初始化的那些類成員的構造時初始值設定項。

換句話說,將這兩個特征(靜態和非靜態成員的初始化器)組合在一起是不正確的。 這兩個功能完全不同。 它們基於完全不相關的內部機制。 你的問題基本上適用於第一個特性:為什么非const靜態成員不能在課堂上初始化? 它基本上是一個C ++ 98問題,最可能的答案是,從來沒有任何理由以這種特殊的方式處理非const靜態成員。 非常規靜態成員按照一般規則處理:它們需要單獨的定義,並且應在定義時提供初始化程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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