2010-04-09 47 views

回答

130

一個編譯單元(通常.cpp文件),任何地方都會做的事:

foo.h中

class foo { 
    static const string s; // Can never be initialized here. 
    static const char* cs; // Same with C strings. 

    static const int i = 3; // Integral types can be initialized here (*)... 
    static const int j; //  ... OR in cpp. 
}; 

Foo.cpp中

#include "foo.h" 
const string foo::s = "foo string"; 
const char* foo::cs = "foo C string"; 
// No definition for i. (*) 
const int foo::j = 4; 

(*)根據標準,如果在不僅僅是整型常量表達式其他代碼中使用,你必須定義i外的類定義的(如j是) 。有關詳細信息,請參閱David的評論。

+21

我有upvoted,但在審查標準後,你的代碼中有一個錯誤:'我'必須*定義*在cpp中。 §9.4.2/ 4 *如果一個靜態數據成員是const整型或常量枚舉類型,那麼它在類定義中的聲明可以指定一個常數初始值設定項,它應該是一個整型常量表達式(5.19)。在這種情況下,成員可以出現在整型常量表達式中。如果該成員在程序中使用並且名稱空間範圍定義中不包含初始值設定項,該成員仍應在名稱空間範圍內定義。* – 2010-04-09 08:35:43

+3

根據您對標準的引用,似乎'i'必須是定義*僅*如果它被用在其他地方而不是在整型常量表達式中,對嗎?在這種情況下,由於沒有足夠的上下文來確保沒有錯誤,或者嚴格地說,如果沒有其他代碼,上述示例是正確的。 現在我非常感謝您的評論(+1),我仍然在自己學習!所以我會試着在答案中澄清這一點,請讓我知道如果它更好... – squelart 2010-04-09 12:12:46

+0

@squelart對不起,如果我聽起來很笨,但除了整型常量表達式之外的其他語句的例子會是? – Saksham 2013-07-20 16:20:46

8

在相同的命名空間內的翻譯單元,通常在頂部:

// foo.h 
struct foo 
{ 
    static const std::string s; 
}; 

// foo.cpp 
const std::string foo::s = "thingadongdong"; // this is where it lives 

// bar.h 
namespace baz 
{ 
    struct bar 
    { 
     static const float f; 
    }; 
} 

// bar.cpp 
namespace baz 
{ 
    const float bar::f = 3.1415926535; 
} 
12

靜態成員需要在一個.cpp翻譯單元在文件範圍內,或在適當的名稱空間進行初始化:

const string foo::s("my foo"); 
1

只有整數值(例如,static const int ARRAYSIZE)在頭文件中被初始化,因爲它們通常用在類頭中以定義諸如數組大小之類的東西。非整數值在實現文件中初始化。

-1
const string foo::s("my foo"); 

它應該在源文件中初始化,否則在測試用例中調用它時出錯。