在构造函数C ++中初始化引用

时间:2011-07-04 21:13:04

标签: c++ constructor

我认为这不是一个重复的问题。有类似的,但他们没有帮助我解决我的问题。

根据this,以下内容在C ++中有效:

class c {
public:
   int& i;
};

然而,当我这样做时,我收到以下错误:

error: uninitialized reference member 'c::i'

如何在构造时成功初始化i=0

非常感谢。

6 个答案:

答案 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)

  

A reference must be initialised to refer to something

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()