簡體   English   中英

C ++靜態const類成員初始化

[英]C++ static const class members initialization

我想擁有一個本身具有靜態成員的類,但是我不知道該怎么做。 那有可能嗎?

我得到錯誤:

一個類中只能初始化靜態const整數數據成員

碼:

namespace misc
{
    class CData
    {
    public:
        CData( ) { };
        CData( int d );

        CData& operator = ( const CData& d );

        static const CData FIRST = CData( 512 ); //how?

    private:
        int data;
    };
}

由於我經常使用FIRST因此我想使用misc::CData::FIRST靜態訪問它,而無需在范圍內的某個地方聲明它。 那有可能嗎?

...無需在范圍內的某個地方聲明它。 那有可能嗎?

不,沒有聲明就不可能(您已經在類聲明中嘗試過這樣做)。 您可能想說的是,沒有在類聲明之外定義它。 同樣,答案是否定的。
在這種情況下,您必須將聲明和定義分開(它只能與基本整數類型(如int一起使用)直接在類聲明中進行初始化)。

首先在類聲明中有一個簡單的聲明(通常是CData.hpp類的東西)

namespace misc {
    class CData {
    public:
        CData( ) { };
        CData( int d );

        CData& operator = ( const CData& d );

        static const CData& FIRST;

    private:
        int data;
    };
}

然后在一個單獨的編譯單元中定義它(通常是CData.cpp類的CData.cpp

namespace misc {
    const CData& CData::FIRST = CData( 512 );
}

...無需在范圍內的某個地方聲明它。 那有可能嗎?

沒有。

C ++標准n3337§9.4.2 / 2

靜態數據成員

靜態數據成員在其類定義中的聲明不是定義,並且可以是cv限定的void以外的不完整類型。 靜態數據成員的定義應出現在包含該成員的類定義的名稱空間范圍中。 (...)

您可以在類中聲明一個靜態數據成員:

namespace misc {
    class CData {
    public:
        //...
        static const CData FIRST;  // declaration
        //...
}

並在(完全).cpp文件之一中進行定義:

namespace misc {
    CData CData::FIRST = CData( 512 );  // definition
}

這是首選的解決方案,但是您需要在類之外使用此定義。 如果它是整數類型,則可以在類中定義該成員

C ++標准n3337§9.4.2 / 3說:

如果非易失性const靜態數據成員是整數或枚舉類型,則其在類定義中的聲明可以指定大括號或相等初始化器,其中每個作為賦值表達式的初始化器子句都是一個常數表達式(。 ..)

對於非整數數據,首選這樣的方法,因為它避免了靜態初始化的失敗。

static const CData FIRST()
{
    static CData first(512); //only initialized once, when first requested

    return first;
}

暫無
暫無

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

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