如何初始化const / non-const静态引用成员?

9
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;
};

问题1> 如何初始化const静态引用?

问题2> 如何初始化非const静态引用?

注: 您可以更改FooA类以说明这些方法。

3个回答

14
以与非引用类型的 static 成员变量相同方式进行初始化:
//Foo.cpp

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

其中fooObj1fooObj2是类型为Foo的全局变量。

请注意,在初始化m_foom_foo2之前必须先初始化fooObj1fooObj2,否则您可能会面临静态初始化顺序混乱问题


2
+1 给 //Foo.cpp 的注释(这些赋值应该在源文件中,而不是头文件中),如果可以的话,另外 +1 给静态初始化顺序混乱问题的备注。 - David Hammen
@Nawaz,你认为以下代码是否合法?const Foo&FooA :: m_foo = Foo(10); Foo&FooA :: m_foo2 = Foo(10); - q0987
@q0987:你试过编译那个代码了吗?它能成功编译吗?第一行可以编译通过,但你将无法使用 m_foo。不要这样做。请改成这样:Foo foo1(10), foo2(20); const Foo & FooA::m-foo=foo1; Foo & FooA::m_foo2=foo2; - Nawaz
@Nawaz,为什么我不能使用那个?如果我理解正确,m_foo会延长Foo(10)的生命周期。是这样吗? - 谢谢 - q0987
@q0987:是的,你说得对。我想说的是:不要这样做:Foo& FooA :: m_foo2 = Foo(10);,因为它无法编译,试图将临时对象绑定到非const引用是不可能的。 - Nawaz

6
与任何其他静态数据成员一样:
Foo foo(5);
const Foo& FooA::m_foo(foo);
Foo& FooA::m_foo2(foo);

3
你可以像初始化任何静态成员一样,将 const 和非 const 静态引用初始化放置在全局作用域中。
const Foo& FooA::m_foo = ...whatever...
Foo& FooA::m_foo2 = ...whatever...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接