初始化参考文献

时间:2011-03-03 10:35:57

标签: c++ reference

我写了下面的代码,我期待得到 五 6 6 6,但我得到了5 6 5 0。似乎“val”在开始时正确地获得了引用,但随后它就丢​​失了。有谁知道我的错误在哪里?

class Count {

    public:  
    void add() {  
    val++;
    }
    void print() {  
    cout << val  << endl;  
    }  
    Count(int c): val(c) {  
    }  
    private:  
    int &val;
};  

int main() {  

    int c = 5;  
    Count teste(c);  
    teste.print();  
    teste.add();  
    teste.print();  
    cout << c << endl;  
    teste.print();  
    return 0;  
}

4 个答案:

答案 0 :(得分:5)

您的构造函数应该通过引用而不是值来获取参数。

答案 1 :(得分:1)

这里的问题是您绑定对value传递的参数的引用。这应该是非法的,但也许不是。 (按值传递的参数是否与临时状态具有相同的状态,是否也适用于基本类型?)

这是什么编译器?

当SpaceCowboy指出你的构造函数是否采用引用参数时,它将起作用。应该这样做,这是包装引用的常规方法。当然,一旦c超出范围,val将无效。

答案 2 :(得分:0)

您可以将私有成员val设置为构造函数中 local 变量c的引用。退出构造函数后,它会引用堆栈上的某个随机值。

答案 3 :(得分:0)

是。要么改变'int&amp; amp; val'到'int val'或将'Count(int c)'更改为'Count(int&amp; c)',这将完成工作。现在你在c'tor中收到一个副本,因为你将该副本分配给引用,你会得到未定义的行为,因为当流程超出构造函数的范围时,副本将被终止因此,您的对象将在堆栈​​上保留对随机位置的引用!