2011-08-16 124 views
4
class Foo { 
private: 
    int m_i; 

public: 
    Foo(int i) : m_i(i) {} 
}; 

class FooA 
{ 
private: 
    const static Foo & m_foo; 
    static Foo & m_foo2; 
}; 

Q1>如何初始化靜態常量引用?如何初始化const /非常量靜態引用成員?

Q2>如何初始化非const靜態參考?

注: 您可以爲類FooA變化,以說明方法。

回答

10

以相同的方式初始化非參考static成員:

//Foo.cpp 

const Foo & FooA::m_foo = fooObj1; 
Foo & FooA::m_foo2 = fooObj2; 

其中fooObj1fooObj2Foo類型的全局變量。

fooObj1fooObj2必須m_foom_foo2之前被初始化,否則你可能會面臨static initialization order fiasco問題。

+2

+1的//Foo.cpp評論(這些分配應在源文件,而不是頭)和(如果我可以)另一個+1有關靜態初始化順序的悲劇問題的言論。 –

+0

@Nawaz,你認爲下面的代碼是合法的嗎? 'const Foo&FooA :: m_foo = Foo(10); Foo&FooA :: m_foo2 = Foo(10);' – q0987

+0

@ q0987:你試過編譯它嗎?它編譯成功嗎?第一行會編譯,但是你不能使用'm_foo'。不要這樣做。做這個intead:'Foo foo1(10),foo2(20); const Foo&FooA :: m-foo = foo1; Foo&FooA :: m_foo2 = foo2;' – Nawaz

5

相同的方式與任何其他靜態數據成員:

Foo foo(5); 
const Foo& FooA::m_foo(foo); 
Foo& FooA::m_foo2(foo); 
3

您初始化const和non-const的靜態引用您會初始化任何靜態成員以同樣的方式:通過將初始化在全球範圍內。

const Foo& FooA::m_foo = ...whatever... 
Foo& FooA::m_foo2 = ...whatever... 
相關問題