C++ 类返回具有新地址的引用
Posted
技术标签:
【中文标题】C++ 类返回具有新地址的引用【英文标题】:C++ Class returns reference with new address 【发布时间】:2018-10-09 19:19:33 【问题描述】:在过去的 24 小时里,我一直在阅读《Sam's Teach Yourself C++ in 24 Hours》一书,下面的代码让我感到困惑。重载的运算符 ++ 返回对 const Counter 对象的引用。因此,我希望名为“a”的 Counter 对象与名为“c”的 Counter 对象具有相同的地址,后者使用 ++ 运算符返回到“a”(在增加成员之后)。但是运行这个简单的代码后你可以看到“a”和“c”的地址是不同的。为什么会这样,因为“a”是对“c”的引用,因此应该具有相同的地址?
#include <iostream>
class Counter
public:
Counter();
~Counter()
int getValue() const return value;
void setValue(int x) value = x;
void increment() ++value;
const Counter& operator++();
private:
int value;
;
Counter::Counter():
value(0)
const Counter& Counter::operator++()
++value;
return *this;
int main()
Counter c;
std::cout << "The value of c is " << c.getValue()
<< "\n";
c.increment();
std::cout << "The value of c is " << c.getValue()
<< "\n";
++c;
std::cout << "The value of c is " << c.getValue()
<< "\n";
Counter a = ++c;
std::cout << "The value of a: " << a.getValue();
std::cout << " and c: " << c.getValue() << "\n";
std::cout << "address of a: " << &a << "\n" << "address of
c: " << &c << "\n";
return 0;
【问题讨论】:
a
不是c
,它也不是对c
的引用。 a
是 c
的副本。您似乎让 Java 或其他类似语言的先入之见影响了您对 c++ 的理解。
Counter a
和 Counter c
是不同的对象,因此它们具有不同的地址。
无关:如果您在 24 小时结束时只是个黑客,请不要太失望。 C++ 需要大量时间和实践才能弄清楚。
@user4581301 我只是在开玩笑说 24 小时部分 :)
@SeanDaley 不用担心。我在嘲笑这本书的名字。
【参考方案1】:
因此,我希望名为“a”的 Counter 对象与名为“c”的 Counter 对象具有相同的地址,后者使用 ++ 运算符返回给“a”。
如果你通过引用捕获返回值,那就是这样,例如
Counter const& a = ++c;
当你使用
Counter a = ++c;
从++c
的返回值构造一个新对象。因此,c
和 a
最终拥有两个不同的地址。
【讨论】:
因此,尽管 ++ 运算符被定义为返回对 const Counter 的引用,但它的返回值可以进入名为“a”的完全独立的新对象。为什么不直接定义 ++ 运算符,使其返回一个 const Counter 对象,而不是对 const Counter 的引用? @SeanDaley 您可以使用返回的参考做一些非常巧妙的事情。虽然它可能对您的课程没有那么有用,但它是在进行格式化 IO 时使>>
和 <<
链的特殊酱汁。对于++
,您仍然可以执行c++.getValue();
之类的操作以上是关于C++ 类返回具有新地址的引用的主要内容,如果未能解决你的问题,请参考以下文章
java中用new运算符新申请建立一个对象的时候返回值是啥?