问题描述
赋值运算符将一个对象复制到另一个成员。如果您没有使赋值运算符过载,它将执行按位复制。 执行按位分配时,两个对象共享相同的存储位置,并且一个对象中的更改反映在另一个对象中。 这个概念和我的代码相反。有人可以解释一下为什么吗。
#include<bits/stdc++.h>
using namespace std;
class A
{
public:
int x;
};
int main()
{
A a1,a2;
a1.x=5;
a2.x=5;
a2=a1;
a1.x=10;
cout<<a1.x<<" "<<a2.x;
return 0;
}
解决方法
执行按位分配时,两个对象共享相同的内存位置,并且一个对象中的更改反映在另一个对象中。
这是不正确的。按位复制分配不会导致对象共享相同的内存。这是一个单独的副本,因此a2
和a1
实际上位于不同的内存位置。
这个概念和我的代码相反。
您可能对使用指针成员变量进行复制分配的情况感到困惑。在那种情况下,实际上默认的按位分配将导致对象的指针指向相同的内存,并且需要deep
复制分配来代替(默认分配)。
您当前的代码虽然没有任何指针成员,所以不需要这种深层复制。
,如果由于两个对象而在类中使用了指针,则原始对象和分配的对象将访问同一内存地址,因此,如果更改此内存位置,则对两个对象可见修改。
#include<bits/stdc++.h>
using namespace std;
class A
{
public:
int x;
int *y;
};
int main()
{
A a1,a2;
a1.x=5;
a1.y = new int(7);
a2.x=5;
a2=a1;
a1.x=10;
*a2.y = 9;
cout<<a1.x<<" "<<a2.x;
cout<<*a1.y<<" "<<*a2.y; // the output is 9 9/ because both object access two same memory address
return 0;
}
,
执行按位分配时,两个对象共享相同的内存位置,并且一个对象中的更改反映在另一个对象中。
是错误的。复制就是复制。这意味着将源对象的存储位置中的数据复制到目标对象的另一个存储位置。没有完成内存位置共享。
,a1 的值复制到 a2 中。如果您的类具有指针,则将指针值(即地址)复制为相同的值,这意味着该指针已经共享了相同的地址,然后更改一个值也更改了另一个值。
,您对默认赋值运算符的理解不正确,默认赋值运算符使用一种称为成员方式复制的复制方法。我不会共享内存。
由于误解了这个概念,所以存在预期的行为。