【问题标题】:question on c++ reference关于 c++ 参考的问题
【发布时间】:2011-04-24 19:13:28
【问题描述】:

假设我有这个向量

vector<Object> m;

然后我有以下任务:

vector<Object> o = m;
vector<Object> k = &m;

向量 o 将是向量 m 的副本,而向量 k 将指向与向量 m 完全相同的对象....我说的对吗?

换句话说,如果我去o.push_back(something),这将修改向量o,但不会修改向量m,而如果我去k.push_back(something),这确实会修改向量m。

我是对还是错?

【问题讨论】:

  • 在发布之前尝试编译代码。

标签: c++ object vector reference variable-assignment


【解决方案1】:

o 正确,k 错误。

vector<Object> k = &m;
//                 ^^ -- you're taking the address of m here

要参考,请使用

vector<Object>& k = m;
//            ^ -- this makes a reference

【讨论】:

    【解决方案2】:

    是的,这在概念上是正确的 - 除非您在示例中遗漏了一个星号或者可能过多地使用了 & 符号。

    vector<Object> o = m;
    vector<Object>* k = &m; // use address-of (&) to create a pointer (*) to m
    

    指针总是带着这个*

    现在,m.push_back(...)k-&gt;push_back(...) 修改完全相同的对象。注意-&gt; 的使用,它用于访问指针的成员。

    如果你想创建一个引用,你不要使用&amp; - 想想它是由编译器隐式完成的:

    vector<Object>& k = m; // no address-of here, but k is a reference to m
    

    现在,k.push_back() 可用于访问m

    【讨论】:

    • "现在,o.push_back(...)k-&gt;push_back(...) 修改完全相同的对象。" ——对不起,这是错误的。 o 是一个副本,所以它是一个不同的对象。我想你的意思是m 两次?
    • Jep,现在它是正确的。 :) +1 以获得更冗长的解释。无论谁投反对票,请解释一下,现在已经更正了。
    • 我不是反对者,但在我看来,OP 询问的是引用,而不是指针,所以也许这就是原因。
    • 你是对的 - 乍一看,他似乎打算创建一个指针,因为他使用了&amp;,后来意识到直言不讳的意图一定是创建参考。仍然将回复留在这里,因为它仍然回答了问题并且可能对 OP 有用。
    【解决方案3】:

    此代码甚至无法编译。表达式&amp;m的类型为vector&lt;Object&gt;*,不能赋值给变量k(其类型为vector&lt;Object&gt;)。

    您可能打算这样做:

    vector<Object> o = m;
    vector<Object>& k = m;
    

    在这种情况下o 将是m 的副本(导致om 具有相同元素的副本,因此修改其中一个的内容不会影响另一个的内容)和mk 都将引用同一个实例(因此,当您使用另一个变量引用向量时,使用两个变量之一对实例所做的任何更改都将立即可见)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多