簡體   English   中英

靜態數據成員的初始化

[英]Initialization of static data member

為什么沒有發生靜態數據成員的默認初始化? 在下面的例子中

struct data_member
{
    data_member(){ cout << "data_member\n"; }
    ~data_member(){ cout << "~data_member\n"; }
};

struct Y
{
    static data_member m;
    Y(){ cout << "Y\n"; }
    ~Y(){ cout << "~Y\n"; }
};

Y y; //call constructor of Y 

但是如果我們從data_member m刪除static說明data_member m ,它將被默認初始化。

struct data_member
{
    data_member(){ cout << "data_member\n"; }
    ~data_member(){ cout << "~data_member\n"; }
};

struct Y
{
    data_member m;
    Y(){ cout << "Y\n"; }
    ~Y(){ cout << "~Y\n"; }
};

Y y; //call Y() and data_member()

必須在類定義之外定義靜態成員。 屆時它將被初始化(也可以默認初始化)。

標准草案中有關static成員變量的以下描述應說明為什么未在類聲明中默認對其進行初始化。

9.4.2靜態數據成員

2在其類定義中聲明static數據成員不是定義,並且可以是cv限定的void之外的不完整類型。 static數據成員的定義應出現在包含該成員的類定義的名稱空間范圍中。 在命名空間范圍的定義中, static數據成員的名稱應使用::運算符由其類名稱限定。

static數據成員在class定義中聲明 通常需要在相應的cpp文件中對此進行定義 (一次):

data_member Y::m;

在這里,您會看到它的默認ctor調用。

struct Y
{
    static data_member m;
    Y(){ cout << "Y\n"; }
    ~Y(){ cout << "~Y\n"; }
};

這僅聲明 m 就編譯器所知, Y::m是在另一個轉換單元中定義的。 由於靜態數據成員是每個類一個,因此您必須能夠在不定義它們的情況下聲明它們,否則當您將標題包含在其中時,您將不能在不違反“一個定義規則”的情況下將類定義放在頭文件中。不同的翻譯單位。

data_member Y::m;

這定義了m 並將導致構造函數調用

基本答案:類成員就像函數一樣。 我們有聲明和定義。 您“聲明”它們的存在@class級別,“定義”由構造函數進行。 使用靜態成員會更加復雜。 它們不是“實例相關的”,構造函數不會“定義”它們。 您必須在課堂外自己做:

Type CLASS::member;

順便說一句,使用靜態成員是相當糟糕的做法。

改用靜態函數:

class Foo{
public:
     Type &getMember(){
         static Type member;
         return member;
     }
};

暫無
暫無

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

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