C++类与对象(默认成员函数之拷贝构造函数)

接前几次的类与对象的默认函数的知识点,下来面是默认成员函数中的拷贝构造函数。是的,它的名字是拷贝构造函数,他其实也是一种构造函数,为什么呢?接下来你就知道了,我们直接看看代码,如下:

上面的代码是我随便写的一个类,其实在这里析构函数是没有必要写的,不影响什么,原因在上一篇文章中说过,这里就不重复了,我们言归正传,来看看主函数中我实例化了两个对象,第一个也就是t,它很好理解,我传参传了10,没有用构造函数的缺省值,那么第二个对象他会怎么初始化呢?还会不会调用构造函数呢?答案是它调用的是拷贝构造函数,我们先来看一下它调试完的结果,如下:

 

我调试了之后,大家可以看到,在1这个地方,都是没有初始化(因为这个是调试到这一句代码了,并没有执行),然后我又往下执行了一步,我们可以看到的是t已经实例化完成,并且已经初始化完成,是我们传参的那个数,再往下执行后,s也实例化完成,并且也是初始化完成。那么他们到底是调用的那个成员函数呢?我们再看这个结果:

 

 

改了下代码,我们可以清楚的看到的是,d与t的地址是一样的,而我在拷贝构造函数中,参数设置的是const Time& d,所以大家不难想象,这个d就是t的别名,所以充分的证明了实例化s的时候,调用的是拷贝构造函数。所以,在自定义类型中,我们实例化一个对象的时候,如果传的参数是同类型时,回电用拷贝构造函数。

那么下面是拷贝构造函数的一些特性,与构造函数一样,名字与类名相同,传参时必须要是引用,而且加const。那么好多人就疑惑了,在这里,为什么要用引用呢?很简单,因为如果不用引用,就像这样,const Time d,如果是这样的话,会引发无穷的拷贝构造函数,相当于死循环调用拷贝构造函数,为什么呢?因为在你用同类型的对象来实例化的时候,就相当于是这个同类型的对象给拷贝构造函数传参,因为是同类型,所以又会调用拷贝构造函数,一直这样无穷无尽的下去,所以一定要用引用。例如下图:

看了上面的图应该会清晰一点,那么,此时问题又来了,为啥要加const ,在我理解,因为此时的d是t的别名,所以我们加个const更加的安全,防止我们不小心把值给改了,加了const 就不会出现这样的问题了。

然后他与构造函数是一样的,如果我们自己不写拷贝构造函数,编译器是会默认生成的,会进行浅拷贝, 所以这里没什么说的。

然后就是,因为我用的编辑器是vim,可能是配置上的原因,导致using namespace std这句代码有警告,所以再用cin或是cout的时候,导致一直显示警告,然后就是调试我用的是gdb来调试的,原因是多用就可以熟悉,大家也可以多用用。用法前面的内容里有,而且非常详细。

最后就是,如果本篇内容对你有用的话就点一下赞吧!!让我看到你来过的痕迹。谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值