Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么引用成员变量相互覆盖?_C++_Reference - Fatal编程技术网

C++ 为什么引用成员变量相互覆盖?

C++ 为什么引用成员变量相互覆盖?,c++,reference,C++,Reference,在下面的代码中,Var的两个实例的_bla成员似乎表示相同的内存位置,因为在一个实例上设置值也会改变另一个实例。执行程序时,输出为: v: 44 v2: 44 x: 22 有人能解释一下吗 #include <iostream> using namespace std; template<typename T> class Var { T &_bla; public: Var(T t) : _bla(t) {} int bla() const

在下面的代码中,Var的两个实例的_bla成员似乎表示相同的内存位置,因为在一个实例上设置值也会改变另一个实例。执行程序时,输出为:

v: 44 v2: 44 x: 22
有人能解释一下吗

#include <iostream>

using namespace std;

template<typename T> class Var {
  T  &_bla;
public:
  Var(T t) : _bla(t) {}

  int bla() const {
    return _bla;
  }
};

using namespace std;

int main() {
  cout << "Hello, World!" << endl;

  int x = 22;
  Var<int> v = {x};
  Var<int> v2 = {44};

  cout << "v: " << v.bla() << " v2: " << v2.bla() << " x: " << x << endl;
  return 0;
}
#包括
使用名称空间std;
模板类变量{
T&u-bla;
公众:
Var(T){}
int bla()常量{
返回_bla;
}
};
使用名称空间std;
int main(){
这是一种未定义的行为,意味着一切皆有可能

ctor的参数
t
通过值传递,它将从参数中复制,然后通过引用分配给
_bla
,当超出ctor的范围时,参数
t
被释放,现在成员变量
_bla
变为悬挂引用


您可以重新考虑您的设计,是否需要成员变量作为引用?参数
t
的类型应该是什么?按常量引用、按引用、按值?(在您的情况下,按值传递显然是错误的。)当您使用成员变量的引用时,最好仔细考虑。

< P>我看,它们实际上引用了var的构造函数的参数,是一个临时拷贝,恰好在同一个内存位置,甚至可能在程序后面被覆盖。


如果您的MemberVariables应该引用非成员变量,则必须通过引用来传递它。然而,在大多数情况下,这是一种非常糟糕和危险的设计。

以下代码更有意义:

template<typename T> class Var {
    T  _bla;
public:
    Var(const T & t) : _bla(t) {}

    int bla() const {
        return _bla;
    }
};
模板类变量{
图布拉;
公众:
Var(const T&T):_bla(T){}
int bla()常量{
返回_bla;
}
};
本质上,该类将按值保留一个副本

在您的原始代码中,您引用了一个临时对象,该对象在您实际打印其值之前被销毁。因此,它是未定义的行为