我认为这不是一个重复的问题。有类似的,但他们没有帮助我解决我的问题。
根据this,以下内容在C ++中有效:
class c {
public:
int& i;
};
然而,当我这样做时,我收到以下错误:
error: uninitialized reference member 'c::i'
如何在构造时成功初始化i=0
?
非常感谢。
答案 0 :(得分:33)
没有“空参考”这样的东西。 有在对象初始化时提供引用。将它放在构造函数的基本初始化列表中:
class c
{
public:
c(int & a) : i(a) { }
int & i;
};
另一种选择是i(*new int)
,但那太可怕了。
编辑:要回答您的问题,您可能只希望i
成为成员对象,而不是参考,所以只需说int i;
,然后编写构造函数可以是c() : i(0) {}
,也可以是c(int a = 0) : i(a) { }
。
答案 1 :(得分:5)
int a;
class c {
public:
int& i;
c() : i (a) {};
};
答案 2 :(得分:4)
除了甜蜜的语法之外,引用的一个关键特性是你非常确定它总是指向一个值(No NULL值)。
设计API时,会强制用户不向您发送NULL。 在使用API时,您可以在不阅读文档的情况下知道NULL不是一个选项。
答案 3 :(得分:0)
参考必须在创建时初始化。因此,您必须在创建类时初始化它。您还必须提供一些法律对象以供参考。
您必须在构造函数中使用初始化程序:
class c {
public:
c(const int& other) : i(other) {}
int& i;
};
答案 4 :(得分:-1)
如果要在默认构造函数中初始化,则应通过将数据传递给构造函数或从堆分配内存来初始化引用。
class Test
{
private:
int& val;
std::set<int>& _set;
public:
Test() : val (*(new int())),
_set(*(new std::set<int>())) { }
Test(int &a, std::set<int>& sett) : val(a), _set(sett) { }
};
int main()
{
cout << "Hello World!" << endl;
Test obj;
int a; std::set<int> sett;
Test obj1(a, sett);
return 0;
}
由于
答案 5 :(得分:-4)
gamma()