#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 ++中的复制构造函数返回一个浅表副本。是不是浅拷贝意味着参考? 或者我错过了什么?
答案 0 :(得分:3)
浅拷贝意味着参考??或者我错过了什么?
你错过了什么。 浅拷贝意味着复制。它将对象的所有成员从一个复制到另一个。它不是参考。创建的副本完全独立于原始
有关浅版和深版的区别,请参阅this excellent tutorial。
答案 1 :(得分:2)
b
是与obj
完全独立的对象。它有a
独立于obj
的。{/ p>
听起来你的想法是引用:
A& b = obj;
在此之后,b
和obj
都引用同一个对象。通过b
进行的更改将通过obj
显示,反之亦然。
答案 2 :(得分:2)
浅拷贝意味着参考??或者我错过了什么?
是的,你错过了什么。
浅拷贝不代表参考。浅拷贝意味着复制成员:如果成员是指针,那么它拷贝地址,而不是内容指针是指向。这意味着,原始对象中的指针和所谓的复制对象指向内存中的相同内容。这被称为浅拷贝。另一方面,深层复制不会复制地址,它会创建一个新指针(在新对象中),为其分配内存,然后复制原始指针指向的内容。
在您的情况下,浅拷贝和深拷贝没有区别,因为类中没有指针成员。每个成员都被复制(像往常一样),并且由于没有成员是指针,因此每个复制的成员都是内存中不同的成员。也就是说,原始对象和复制的对象在内存中是完全不同的对象。两个对象绝对没有任何共享。因此,当您修改一个时,它根本不会改变另一个中的任何内容。
答案 3 :(得分:0)
是的,默认的复制构造函数是浅拷贝。查看更多here
但是,b与a完全脱节,所以这两件事并没有直接相关。
答案 4 :(得分:0)
A b(obj)
将obj
信息复制到新创建的对象b
中。是的,它是浅层副本,因此b
实际上并不控制分配给它的内容。您可能正在考虑的是参考:
A& b = obj;
b.a = 6;
std::cout << obj.a; // 6