2011-08-16 121 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... 
相关问题