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


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

    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.........

  • 相关阅读:
    黑马程序员_Java学习日记num13
    黑马程序员_Java学习日记num12
    黑马程序员_Java学习日记num11
    黑马程序员_Java学习日记num10
    黑马程序员_Java学习日记num9
    黑马程序员_Java学习日记num8
    黑马程序员_Java学习日记num7
    黑马程序员_Java学习日记num6
    黑那程序员_Java学习日记num5
    Happy May!
  • 原文地址:https://www.cnblogs.com/doulcl/p/10180839.html
Copyright © 2020-2023  润新知