拷贝构造函数相关总结

问题:

1. 拷贝构造函数是构造函数吗?

是的。在创建对象时是被自动调用的构造函数的一种。因此,一个类可以有构造函数的多个版本。此外,构造函数是可以重载的。

2. 什么情况下会调用拷贝构造函数?

创建对象时,以初始化值的数量、类型去匹配构造函数。程序会自动匹配合适的构造函数,如果没给初始化值的就调用无参构造函数,如果初始化值是一个已有的对象则调用拷贝构造函数。

3. 为什么要专门起个名字?拷贝构造函数有什么特殊性?

专门命名的原因是拷贝构造函数具有特殊性,特殊在于:如果一个类没有编写拷贝构造函数,则系统为它安排一个默认的版本。默认版本的功能是数据块复制:即把初始值的对象的数据成员值对应的拷贝到当前新创建的对象当中。

4. Java有拷贝构造函数吗?

Java没有“拷贝构造函数”这个概念,但允许以一个对象作为初始值创建另一个对象。

关于构造函数的形参为什么为引用类型的思考:

  • CT的拷贝构造函数:

    CT(CT &x)
    {*this=x}
    

    复制构造函数只有一个参数,由于在创建时传入的是同种类型的对象,所以一个很自然的想法是将该类型的对象作为参数,像这样:

    Sample (Sample a);
    

    不幸的是,即使是这样朴实无华的声明也隐含了一个微妙的错误,呵,我们来看看:当某个时候需要以一个Sample对象的值来为一个新对象进行初始化时,编译器会在各个重载的构造函数版本(如果有多个的话)搜寻,它找到的这个版本,发现声明参数与传入的对象一致,因此该构造函数将会被调用。目前为止,一切都在我们的意料之中,但问题很快来了:该函数的参数我们使用了值传递的方式,按照前面的分析,这需要调用复制构造函数,于是编译器又再度搜寻,最后当然又找到了它,于是进行调用,但同样地,传参时又要进行复制,于是再调用…这个过程周而复始,每次都是到了函数入口处就进行递归,直到堆栈空间耗尽,程序崩溃…

由是观之,值传递看来是行不通的了;我想C语言的用户这时很快会反应到与值传递对应的方式:地址传递(传址),于是声明变为这样:

Sample (Sample *p);

只作为一般的构造函数,它应该可以运行得很好,但别忘了我们要提供的是复制构造函数,它要求能够接受一个同类型对象,像这样:

Sample a;
Sample b(a);

而不是接受指针:

虽然在初始化对象时可以像上面一样人为加一个取址符,但在函数参数表中(或者函数返回)进行值传递时,编译器可不知道在找不着合适定义的情况下牵就选择你的指针版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yrian.c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值