在过去的24小时中,我一直在阅读“ Sam's Teach Yourself C ++ in 24 Hours”一书,以下代码使我感到困惑。重载的运算符++返回对const Counter对象的引用。因此,我希望计数器对象“ a”将与计数器对象“ c”具有相同的地址,后者使用++运算符返回给“ 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;
}
答案 0 :(得分:4)
因此,我希望Counter对象“ a”将与Counter对象“ c”具有相同的地址,后者通过++运算符返回给“ a”。
如果您通过引用捕获返回值,例如
Counter const& a = ++c;
使用时
Counter a = ++c;
根据返回值++c
构造一个新对象。因此,c
和a
最终有两个不同的地址。