如何在 c++ 中显式初始化引用

How do you explicitly initialize a reference in c++?

本文关键字:初始化 引用 c++      更新时间:2023-10-16

我有以下代码:

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

我在构造函数上收到一个错误,因为SomeOtherClassConstructor for 'SomeOtherClass' must explicitly initialize the reference member 'someObj'.

所以我想我的问题很紧。如何初始化引用?

您正在尝试存储对立即被破坏的临时对象的引用,因此肯定会出错; 即使使用其他答案中描述的构造函数初始化列表。

引用应指向存储在其他位置的对象,就像指针一样。您确定在这种情况下甚至需要使用引用吗?

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

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

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

思路如上,但您必须传入一个生存期不短于您正在构建的SomeOtherClass实例的对象。

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

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

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