C++类拷贝控制 深拷贝 浅拷贝

参考博文:https://www.cnblogs.com/zhxmdefj/p/11579364

拷贝构造函数,拷贝赋值运算符

拷贝构造函数

第一个参数是自身类类型引用,其他参数都有默认值的构造函数就是拷贝构造函数。

class Sales_data{

public:

      Sales_data();    //默认构造函数

      Sales_data(const Foo&);  //默认拷贝构造函数

};

拷贝构造函数用来初始化非引用类类性参数,所以拷贝构造函数自己的参数必须是引用类型

为什么一定要是引用类型?

因为如果不是引用,那么调用拷贝构造函数,必须拷贝它的实参,为了拷贝实参,又需要调用拷贝构造函数,无限循环。

合成拷贝构造函数(默认)

和默认构造函数一样,编译器会帮你定义一个默认拷贝构造函数(如果不手动定义的话),不同的是,

如果定义了其他构造函数,编译器还是会给你合成一个拷贝构造函数。

 

直接初始化,拷贝初始化

使用直接初始化,我们是在要求编译器使用普通的函数匹配,来选择与我们提供的参数最匹配的构造函数

使用拷贝初始化,要求编译器将右侧运算符对象拷贝到正在创建的对象中(需要的话还进行类型转换)

 

拷贝赋值运算符

赋值运算符本质也是函数,它由operator关键字后面接要定义的运算符的符号组成,赋值运算符就是一个名为operator=的函数,

和其他函数一样,它也有一个返回类型和一个参数列表。

 

 

合成拷贝赋值运算符(默认)

和拷贝构造函数一样,如果一个类未定义自己的拷贝赋值运算符,编译器会生成一个合成拷贝赋值运算符,

编译器会生成一个合成拷贝赋值运算符,类似拷贝构造函数,对于某些类,合成拷贝赋值运算符用来禁止该类型对象的赋值。

拷贝赋值运算符会将右侧运算对象的每个非static成员赋予左侧运算对象的对应成员,对于数组类型的成员,

逐个赋值数组元素合成拷贝赋值运算符返回一个指向其左侧运算对象的引用。

 

 

 

浅拷贝和深拷贝的区别

1.浅拷贝也叫位拷贝,拷贝的是地址。容易导致野指针

2.深拷贝也叫值拷贝,拷贝的是内容。

如果一个类拥有资源,当这个类的对象发生复制的过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。

posted @ 2024-04-10 12:21  往事携冷风  阅读(24)  评论(0编辑  收藏  举报