[英]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.