拷贝构造函数与深浅拷贝

当我们通过普通的构造函数构造出一个对象之后,用这个对象去初始化另一个新建的对象,如这种:

test a(1);

test b = a  或者test b(a) 这两种

还有这种 test & gettestObject()

则需要调用拷贝构造函数,如果我们没有显式的声明一个拷贝构造函数,系统会生成一个默认的,自定义拷贝构造函数是一种良好的编程习惯

#include "stdafx.h"
#include <stdio.h>
#include<iostream>

class people
{
public:
    people(char* name)
    {
        strcpy(cname,name);
        pname = new char[strlen(cname)+1];
        if(name != NULL)
        {
            strcpy(pname,cname);
        }
    }
    void show()
    {
        std::cout<<"my name is:"<<pname<<std::endl;
    }
/*
    people(people& p1)
    {
        std::cout<<"深拷贝"<<std::endl;
        strcpy(cname,p1.cname);
        pname = new char[strlen(cname)+1];
        if(cname != NULL)
        {
            strcpy(pname,cname);
        }
    }
    */
    ~people()
    {
        if(pname != NULL)
        {
            delete[] pname;
            pname = NULL;
        }
    }
private:
    char cname[20];
    char * pname;
};

void main()
{
    people a("lcl");
    people b = a;
    b.show();
    system("pause");
}

堆空间看成一种资源,系统默认的拷贝函数属于浅拷贝,去掉注释的部分,我们看浅拷贝后运行起来a,b的地址情况:

只是简单的复制,a、b对象内成员指针指向同一片空间

那在析构的时候,先析构a,那b中的pname就会变成野指针,也可以这么想,两个析构函数释放同一块堆内存会导致程序错误

深拷贝,加上自定义的拷贝函数后,就变成了深拷贝,复制了一份相同的资源,放在不同的地方,去掉上图注释部分,运行得到如下:

这就完成了深拷贝的过程。

混时长ing.........

原文地址:https://www.cnblogs.com/doulcl/p/10180839.html