与 C++ 复制构造函数相关的查询

c++ copy constructor related query

本文关键字:查询 构造函数 C++ 复制      更新时间:2023-10-16
#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的。

听起来您想到的是一个参考

A& b = obj;

在此之后,bobj都引用同一个对象。通过b所做的更改将通过obj可见,反之亦然。

浅拷贝意味着参考?? 还是我错过了什么?

是的,你错过了一些东西。

浅拷贝并不意味着参考。浅拷贝意味着复制成员:如果成员是指针,那么它复制地址,而不是指针指向的内容。这意味着,原始对象中的指针和所谓的复制对象指向内存中的相同内容。这称为浅拷贝。另一方面,深拷贝不会复制地址,它会创建一个新指针(在新对象中),为其分配内存,然后复制原始指针指向的内容

在您的情况下,浅拷贝和深拷贝没有区别,因为类中没有指针成员。每个成员都被复制(像往常一样),并且由于没有成员是指针,因此每个复制的成员都是内存中的不同成员。也就是说,原始对象和复制的对象是内存中完全不同的对象。这两个对象绝对没有任何共享的内容。因此,当您修改一个时,它根本不会更改另一个中的任何内容。

是的,默认复制构造函数是浅拷贝。在此处查看更多内容

但是,b与a完全不相交,所以这两件事没有直接关系。

A b(obj) obj信息复制到新创建的对象b中。是的,它是一个浅拷贝,因此b实际上并不控制分配给它的内容。您可能正在考虑的是一个参考:

A& b = obj;
b.a = 6;
std::cout << obj.a; // 6