c ++拷贝构造函数相关查询

时间:2013-01-26 16:18:53

标签: c++ algorithm copy-constructor default-copy-constructor

#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 ++中的复制构造函数返回一个浅表副本。是不是浅拷贝意味着参考? 或者我错过了什么?

5 个答案:

答案 0 :(得分:3)

  

浅拷贝意味着参考??或者我错过了什么?

你错过了什么。 浅拷贝意味着复制。它将对象的所有成员从一个复制到另一个。它不是参考。创建的副本完全独立于原始

有关浅版和深版的区别,请参阅this excellent tutorial

答案 1 :(得分:2)

b是与obj完全独立的对象。它有a独立于obj的。{/ p>

听起来你的想法是引用

A& b = obj;

在此之后,bobj都引用同一个对象。通过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