C++拷贝构造函数

1.拷贝构造函数是构造函数的一个重载函数。

如上图可以看出Date()和Date(const Date& d1)互相构成重载函数

2.拷贝构造函数参数的定义 

拷贝构造函数的第一个参数必须是类类型对象的引用,如上图所示,const Date& d1是拷贝函数的第一个参数,拷贝函数也可以有多个参数,但第一个参数后面的参数必须都有缺省值

3.拷贝构造的无穷递归

当我们用传值传参的方式定义拷贝函数的第一个参数,当我们调用拷贝函数就会发生拷贝构造的无穷递归。

首先我们要明白一个点:传值传参是通过拷贝函数,将实参的数据拷贝给形参,所以传值传参会涉及到拷贝函数的调用,但是!!!!你的拷贝函数的形参也是传值传参!!!!!,所以当你在调用构造函数时,也会再调用另一个拷贝构造函数,然后无穷一直调用一直调用。造成了无穷递归。

4.拷贝函数的深浅拷贝

1.浅拷贝

当我们进行对象传值传参时,如果我们没有定义拷贝函数,那么编译器自动生成的拷贝函数会帮助我们拷贝内置类型.但是这种拷贝是针对于内置类型没有指向系统任何资源的,如果有内置类型指向了系统的某块空间那么编译器自动生成的构造函数还会有用吗,让我们来一步一步分析。

 

我们看上面的图,当程序进行将拷贝函数进行完时,S1和S2的内置类型保持一直,但这样看上去好像没什么问题是吧,但是我们想想,当我向系统申请空间用完了之后是不是要释放空间呐,那我们再写一个析构函数防止这个程序内存泄漏看看。 

当我们写了一个析构函数再运行程序时便会出现错误,为什么。

你们看这S1和S2确实是拷贝了,但是那个指针指向的地址也被拷贝了,当我析构一个对象时,这个对象的指针指向的空间已经,被释放了,那我们再析构一个对象复制的对象时,这块空间已经被释放了,再释放就会发生报错。所以这就是浅拷贝,是将内置类型变量一个字节一个字节地进行拷贝,当我们有系统资源的申请时,我们就需要使用深拷贝了 

2.深拷贝

深拷贝我们需要用到一个函数mencpy,知道这个函数用法就知道

我们不能像浅拷贝那样一个字节一个字节进行拷贝,我们需要将数据直接拷贝到对象中,所以我们需要memcpy

像这样就不会发生报错。

5.野引用

传值传参返回会产生一个临时变量,然后调用拷贝函数,将对象的数据拷贝进这个临时对象中。但是如果我们用传值引用返回,是不会产生拷贝的,这个引用只是一个别名,当引用的对象在一个局部的函数中时,这个函数结束,那么这个对象就销毁了,那么它的引用就不知道引用谁了,就造成了野引用,就和野指针差不多,传引用返回可以减少拷贝函数的调用,但一定要确保,函数结束引用的对象还在,才能用引用返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值