繁体   English   中英

Operator =:返回参考值与值

[英]Operator=: return reference vs. value

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

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

地址组都是一样的; 这被理解为赋值运算符通过引用返回。

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

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

返回值仅在您使用它时才有意义。 例如:

(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相同,但如果返回值则不同。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM