3

我有以下代码:

class SomeClass {};

class SomeOtherClass {
    SomeClass& someObj;
public:
    SomeOtherClass() {someObj = SomeClass();}
};

而且我在构造函数上SomeOtherClassConstructor for 'SomeOtherClass' must explicitly initialize the reference member 'someObj'.

所以我想我的问题很简单。你如何初始化一个引用?

4

3 回答 3

9

您正在尝试存储对立即销毁的临时对象的引用,这样肯定会出错;即使使用其他答案中描述的构造函数初始化列表也是如此。

引用应该指向存储在别处的对象,就像指针一样。您确定在这种情况下甚至需要使用参考吗?

于 2012-07-01T21:22:52.170 回答
7

作为构造函数初始化列表的一部分:

SomeOtherClass() : someObj(SomeClass()) {}

更新:我真的应该警告说,这是你不应该逐字使用的东西,因为它会导致对即将死亡的临时对象实例的引用。

想法是上面的,但是你必须传入一个生命周期不短于SomeOtherClass你正在构造的实例的对象。

于 2012-07-01T21:20:17.073 回答
4

您必须在构造函数的初始化列表中对其进行初始化,因为引用没有“默认”或“空”初始化:

class SomeOtherClass {
    SomeClass& someObj;
public:
    SomeOtherClass(SomeClass& sc) : someObj(sc) {}
};

正如在另一个答案中所指出的那样进行编辑,您应该注意将您的引用初始化为一个对象,该对象的生命周期与包含该引用的对象相同或更长。在上面的示例中,假设scSomeOtherClass实例寿命更长。

于 2012-07-01T21:20:36.513 回答