我正在经历this并且有点困惑。假设我将一个类声明为:
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
地址组都相同;这被理解为赋值运算符通过引用返回。
但是我注意到,如果我将赋值运算符定义为按值返回,则会返回相同的地址组值。
在上面提到的链接中,如果按值返回,则会回答该对象的副本。那为什么它返回相同的地址值。他们不应该是不同的。请帮助清除我的概念。
答案 0 :(得分: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
相同,但如果您返回了值,则会有所不同。
答案 1 :(得分:-1)
我认为,这个地址是一样的,因为你只是覆盖了结构的内部内容,而不是它在内存中的位置。