拷贝构造函数 浅拷贝构造函数 深拷贝构造函数

本文介绍了拷贝构造函数的概念及其特点,特别关注了浅拷贝与深拷贝的区别。通过一个程序实例展示了类中指针类型成员变量在浅拷贝与深拷贝构造函数下的不同行为,强调了深拷贝构造函数解决浅拷贝构造函数缺点的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 拷贝构造函数:对象之间复制,或者使用一个对象给另一个初始化时使用。

  2. 拷贝构造函数特点:也是构造函数,但是,形参列表中必须有一个对本类对象的引用,并且如果有其他形参必须被初始化。

  3. 浅拷贝构造函数的特点:简单来说,浅拷贝构造函数只是将类中成员变量进行简单的赋值。那么,如果有指针类型的成员变量,这种拷贝只会将指针指向的空间的地址进行赋值,拷贝后的对象与源对象中的指针只会指向同一个地址,修改其中一个指针指向的变量的值,将会导致另一个也发生变化。

  4. 深拷贝构造函数特点:为了解决浅拷贝构造函数的缺点,可以使用深拷贝构造函数。在深拷贝构造函数中,为所有的指针都申请一段新的空间,然后使用间接寻址的方式进行赋值。

  5. 简单的一个程序实例( 直接可以运行, 因为Boy类使用的是浅拷贝构造函数,因此king的名字发生了变化之后,jack的名字也发生变化,但是Dog是深拷贝构造函数,因此即使mala的名字发生了变化,但是braze的名字仍然保持不变)

#include <iostream>
using namespace std;

class Boy{
public:
    Boy(const char* name);
    Boy(const Boy& b);
    int modifyName(const char name[]);
    char* getName();
    ~boyName(){
        delete boyName;
    }
private:
    char* boyName;    
}

class Dog(
public:
    Dog(const char* name);
    Dog(const Dog& d);
    int modifyName(const char name[]);
    char* getName();
    ~Dog(){
        delete dogName;
    }
private:
    char* dogName;
)
Boy::Boy(const char* name){
    boyName = new char[strlen(name)+1];
    strcpy(boyName, name);
}
Boy::Boy(const Boy& b){
    boyName = b.boyName;
}
char* Boy::getName(){
    return boyName;
}
int Boy::modifyName(const char name[]){
    delete boyName;
    boyName = new char[strlen(name)+1];
    strcpy(boyName, name);
}
Dog::Dog(const char* name){
    dogName = new char[strlen(name)+1];
    strcpy(dogName, name);
}
Dog::Dog(const Dog& d){
    dogName = new char[strlen(d.dogName)+1];
    strcpy(dogName, d.dogName);
}
char* Dog::getName(){
    return dogName;
}
int Dog::modifyName(const char name[]){
    delete dogName;
    dogName = new char[strlen(name)+1];
    strcpy(dogName, name);
}
int main(){
    Boy jack("Jack");
    Dog braze("Braze");
    cout<<jack.getName()<<" has a dog "<<braze.getName()<<endl;
    Boy king(jack);
    Dog mala(braze);
    king.modifyName("King");
    mala.modifyName("mala");
    cout<<king.getName()<<" has a dog "<<mala.getName()<<endl;
    cout<<"*************** see the first boy and his dog **************"<<endl;
    cout<<jack.getName()<<" has a dog "<<braze.getName()<<endl;
    cout<<"Because class Boy uses shallow copy constructor so that the name of the first boy is changed when the second boy has his own name "<<endl;    
}

17163315_foxk.jpg






转载于:https://my.oschina.net/u/2368952/blog/415937

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值