拷贝构造函数(深拷贝)和(浅拷贝)

调用拷贝构造函数的三种情况:

1>用已经存在的对象初始化另一个对象

2>对象作为实参传递给形参

3>对象作为函数返回值


>浅拷贝:就是指针的拷贝,通过拷贝过来的指针来之向某个地址

>深拷贝:若类中成员属性有指针成员数据类型时,此时要开辟好一块儿真是的空间然后指针指向它,而不是直接拷贝指针

#include <iostream>

using namespace std;

class Personlist{
public:
    Personlist(){}
    Personlist(const Personlist &p);
private:
    string *namelist;
    int size_;
};
Personlist :: Personlist(const Personlist &p){    //这里就是申请一块儿空间

    if(p.namelist != NULL){
        namelist = new string[size_ = p.size_];
        for(int i = 0; i < size_; i++){
            namelist[i] = p.namelist[i];
        }
    }
}

Personlist :: Personlist(const string new_name[], int new_size){
    size_ = new_size;
    namelist = new string[size_];
    for(int i = 0; i < new_size; i++)
        namelist[i] = new_name[i];
}
int main()
{
    string namelist[3] = {"Tom", "Jack", "Allen"};
    Personlist p1(namelist, 3);
    Personlist p2(p1);    //这里会调用拷贝构造函数
    return 0;
}

==================================================

//这里若将自定义的拷贝构造函数删掉,那么就可以看出对其中一个对象的namelist成员属性改变,必会影响另一个对象(系统自动调用的拷贝构造函数是浅拷贝)

#include <iostream>

using namespace std;

class Personlist{
public:
    Personlist(){}
    Personlist(const Personlist &p);
    Personlist(const string new_name[], int new_size);
    void set_name(const string &new_name, int i);
    void disp();
private:
    string *namelist;
    int size_;
};

void Personlist :: set_name(const string &new_name, int i){
    namelist[i] = new_name;
}

Personlist :: Personlist(const Personlist &p){

    if(p.namelist != NULL){
        namelist = new string[size_ = p.size_];
        for(int i = 0; i < size_; i++){
            namelist[i] = p.namelist[i];
        }
    }
}

Personlist :: Personlist(const string new_name[], int new_size){
    size_ = new_size;
    namelist = new string[size_];
    for(int i = 0; i < new_size; i++)
        namelist[i] = new_name[i];
}

void Personlist :: disp(){
    cout << "The names are";
    for(int i = 0; i < size_; i++){
        cout << namelist[i] << "\t";
    }
    cout << endl;
}

int main()
{
    string namelist[3] = {"Tom", "Jack", "Allen"};
    Personlist p1(namelist, 3);
    Personlist p2(p1);
    cout << "改变之前" << endl;
    p1.disp();
    p2.disp();
    p2.set_name("Peter", 1);
    cout << "改变之后" << endl;
    p1.disp();
    p2.disp();
    cout << endl;
    return 0;
}
总结:一般类中有指针成员的数据类型,那么类中的赋值语句和拷贝构造函数就需要重新编写,不能使用默认的函数,杜绝浅拷贝
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值