#include<iostream>
class A{
public :
int a;
};
int main(){
A obj;
obj.a = 5;
A b(obj);
b.a = 6;
std::cout<<obj.a;
return 0;
}
为什么答案返回为 5 ,默认情况下 C++ 中的复制构造函数返回浅拷贝。浅拷贝不就是引用吗??还是我错过了什么?
#include<iostream>
class A{
public :
int a;
};
int main(){
A obj;
obj.a = 5;
A b(obj);
b.a = 6;
std::cout<<obj.a;
return 0;
}
为什么答案返回为 5 ,默认情况下 C++ 中的复制构造函数返回浅拷贝。浅拷贝不就是引用吗??还是我错过了什么?
浅拷贝意味着参考??还是我错过了什么?
你错过了一些东西。浅拷贝意味着拷贝。它将对象的所有成员从一个复制到另一个。它不是参考。创建的副本完全独立于原件
有关浅拷贝和深拷贝之间的区别,请参阅这个优秀的教程。
b
是与 完全分开的对象obj
。它有自己a
独立的obj
's。
听起来您的想法是参考:
A& b = obj;
在此之后,两者都b
引用obj
同一个对象。through 所做的更改b
将是可见的obj
,反之亦然。
浅拷贝意味着参考??还是我错过了什么?
是的,你错过了一些东西。
浅拷贝不代表参考。浅复制意味着复制成员:如果成员是指针,则复制地址,而不是指针指向的内容。这意味着,原始对象中的指针和所谓的复制对象中的指针指向内存中的相同内容。这就是所谓的浅拷贝。另一方面,深拷贝不复制地址,它创建一个新指针(在新对象中),为其分配内存,然后复制原始指针指向的内容。
在您的情况下,浅拷贝和深拷贝没有区别,因为类中没有指针成员。每个成员都被复制(像往常一样),并且由于没有成员是指针,因此每个复制的成员都是内存中的不同成员。也就是说,原始对象和复制的对象在内存中是完全不同的对象。这两个对象之间绝对没有任何共享。因此,当您修改一个时,它根本不会改变另一个。
A b(obj)
将信息复制obj
到新创建的对象b
中。是的,它是一个浅拷贝,因此b
实际上并不能控制分配给它的内容。您可能正在考虑的是参考:
A& b = obj;
b.a = 6;
std::cout << obj.a; // 6
是的,默认的复制构造函数是浅拷贝。在这里查看更多
但是,b 与 a 完全不相交,因此这两件事没有直接关系。