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 的引用。 ac 的副本。您似乎让 Java 或其他类似语言的先入之见影响了您对 c++ 的理解。 Counter aCounter c 是不同的对象,因此它们具有不同的地址。 无关:如果您在 24 小时结束时只是个黑客,请不要太失望。 C++ 需要大量时间和实践才能弄清楚。 @user4581301 我只是在开玩笑说 24 小时部分 :) @SeanDaley 不用担心。我在嘲笑这本书的名字。 【参考方案1】:

因此,我希望名为“a”的 Counter 对象与名为“c”的 Counter 对象具有相同的地址,后者使用 ++ 运算符返回给“a”。

如果你通过引用捕获返回值,那就是这样,例如

Counter const& a = ++c;

当你使用

Counter a = ++c;

++c 的返回值构造一个新对象。因此,ca 最终拥有两个不同的地址。

【讨论】:

因此,尽管 ++ 运算符被定义为返回对 const Counter 的引用,但它的返回值可以进入名为“a”的完全独立的新对象。为什么不直接定义 ++ 运算符,使其返回一个 const Counter 对象,而不是对 const Counter 的引用? @SeanDaley 您可以使用返回的参考做一些非常巧妙的事情。虽然它可能对您的课程没有那么有用,但它是在进行格式化 IO 时使 &gt;&gt;&lt;&lt; 链的特殊酱汁。对于++,您仍然可以执行c++.getValue(); 之类的操作

以上是关于C++ 类返回具有新地址的引用的主要内容,如果未能解决你的问题,请参考以下文章

java中用new运算符新申请建立一个对象的时候返回值是啥?

从函数返回,具有动态字段的对象 c++

Swig - 绑定一个返回对导向器类指针的引用的方法

如何在 C++ 中通过引用返回类对象?

有没有正确的方法在 C++ 中通过引用返回一个新的对象实例?

在 C++ 中通过引用传递类成员函数返回值