在类构造函数中初始化引用变量

7

我还在摸索C++引用的语义。

我有一个类,其中一个成员是引用类型,并且我在构造函数中初始化了这个引用。

template<class T>
class AVLNode {

private:
       T & data;
public:
       AVLNode(T & newData) {
            data = newData;
        }
};

但我在构造函数行收到了这个错误:
error: uninitialized reference member ‘AVLNode<int>::data’ [-fpermissive]

我不太理解这句话,我在类构造时立即初始化了引用,因此引用未初始化的问题应该不存在,是吗?


3
你不需要初始化它,只需对其进行赋值即可。 - chris
不是重复的,对我的问题的回答包括了初始化器的清晰定义。 - Ethan
1个回答

23

data是一个引用,因此必须在构造函数初始化器中进行初始化:

AVLNode(T & newData): data(newData) {

}

您可能会发现这篇文章有用:引用成员变量必须在构造函数初始化列表中初始化。当您编写类的构造函数时,您可能还需要了解初始化赋值之间的区别。引用C++ Primer pp455的话:

某些成员必须在构造函数初始化程序中初始化。对于这些成员,在构造函数体中对它们进行赋值是行不通的。无论类型如何,都必须在构造函数初始化程序中初始化没有默认构造函数的类类型成员以及const或引用类型的成员。


非常有趣。那很有效!我的C++书实际上根本没有涉及这些内容!感谢您的帮助。 - Ethan
5
如果这本书实际上没有提到成员初始化列表,那就把它烧了。 - Balog Pal
你知道吗,我差点买了C++ Primer...但最终我还是买了C++ Primer Plus -_- - Ethan
如果它被提及但没有列在索引中,那么请注意... - Ethan

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