1

我正在经历这个,有点困惑。假设我将一个类声明为:

class cls
{
public:
    int x;
    cls(int _x):x(_x){}
    cls& operator=(cls& ob)
    {
        x = ob.x;
        return *this;
    }
};

然后创建 2 个对象并执行复制操作,然后打印赋值运算符重载前后两个变量的地址:

cls o1 = 7;
cls o2 = cls(8);
cout<<&o1<<endl;    //0330F880
cout<<&o2<<endl;    //0330F874
o1 = o2;
cout<<&o1<<endl;    //0330F880
cout<<&o2<<endl;    //0330F874

两者地址组相同;这被理解为赋值运算符通过引用返回。

但是我注意到,如果我将赋值运算符定义为按值返回,则会返回相同的地址组值。

在上面提到的链接中,回答是如果按值返回,将返回对象的副本。那为什么它返回相同的地址值。他们不应该是不同的。请帮助清除我的概念。

4

2 回答 2

5

仅当您对其进行操作时,返回值才有意义。例如:

(o1 = o2).do_something();

或等效地:

(o1.operator=(o2)).do_something();

do_something()方法将在返回的对象上运行-在您的情况下是原始实例,o1因为它返回了引用。但是,如果您更改代码以返回一个值,那么do_something()将在.o1

如果您有第三个对象cls* o_ptr;并执行以下操作:

cls o1 = 7;
cls o2 = cls(8);
cls* o_ptr = &(o1=o2);

如果您显示o_ptr,您会看到它与&o1返回引用相同,但如果返回值则不同。

于 2013-07-30T18:59:59.897 回答
-1

我认为,那个地址是一样的,因为你只是覆盖结构的内部内容,而不是它在内存中的位置。

于 2013-07-30T18:59:49.603 回答