【问题标题】:What happens when assigning passed-by-reference variable to struct member将按引用传递的变量分配给结构成员时会发生什么
【发布时间】:2015-10-05 16:46:06
【问题描述】:

我定义了这个struct

template<class T>
struct Node {
   T value;
   Node(const T& v) : value(v) {}
};

我想知道我这样做时到底发生了什么

int i = 3;
Node<int>* my_node = new Node<int>(i);

通过打印出imy_node-&gt;value 的地址,我意识到它们指的不是同一个地址。我确实预料到了这种行为,因为强制将我的新指针放置在特定地址以包装我的引用传递参数是没有意义的!!!

但我想知道&amp; 的作用是什么?是否只是为了确保在传递给方法时不会复制参数?如果是,那是否只是为了避免大量复制?或者使用&amp;还有其他目的吗?

value(v)value = v 只需将整个数据类型复制到新的内存空间中,不管v 是否通过引用传递,对吗?

编辑:对不起,我试图缩短我的代码并最终使它变得模棱两可。刚刚修好了。

【问题讨论】:

  • 首先,引用与地址无关。有时获取引用的地址会产生与其引用的对象相同的地址,有时则不会。但是在您的示例中,您甚至一开始就错了-您的 int value 不是引用,而是它自己的对象。
  • 请让你的变量名保持一致,我听不懂。
  • @MarkRansom 感谢您的注意。修复它
  • @SergeyA 我试过cout &lt;&lt; &amp;i,不是说i的地址吗??

标签: c++ pointers copy pass-by-reference


【解决方案1】:

此语句格式错误:Node* my_node = new Node(i);

但我想知道 & 的作用是什么?是否只是为了确保 传递给方法时不复制参数?如果是的话,是吗? 只是为了避免大量复制(如果是 int 以外的大数据类型 在这个例子中)?或者使用&还有别的目的吗?

&在这种情况下的作用和你说的完全一样。我使用的一般经验法则是按值传递内置函数(例如 int、double),并通过 const 引用传递其他所有内容,以避免不必要的复制。

而 value(v) 或 value = v 只需将整个数据类型复制到一个新的 内存空间,不管 v 是否通过引用传递,我是 对吧?

这也是正确的。但是对于非内置函数,这两个语句在构造函数中使用时会有所不同。第一个是初始化并在初始化列表中完成(您在示例中已完成),后者是赋值并在构造函数主体中完成。对于非内置函数,使用初始化列表通常效率更高。否则,该对象在您进行分配之前默认初始化。

【讨论】:

  • 感谢您的详细解释。你能告诉我为什么Node* my_node = new Node(i) 不好和/或更好的形式是什么?
  • 模板的声明正确使用了T。但是使用模板时需要指定类型,所以代码应该是:Node my_node = new Node(i);
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 2017-09-15
  • 2023-03-04
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多