浅拷贝与深拷贝

来源:互联网 发布:mysql当前时间减一天 编辑:程序博客网 时间:2024/06/10 23:52

    在C++中,如果不显示声明拷贝构造函数的话,C++编译器会提供一个默认拷贝构造函数,这里的默认拷贝构造函数形成的效果就是浅拷贝。

    浅拷贝的意思即:如果是指针变量的话,只是将指针变量的内存地址复制给新对象中的指针变量,并未将指针指向的对象重新开辟内存空间,这样留下后患,形成野指针现象。

    通过程序测试如下:

Name(const char *myp)//构造函数{m_len = strlen(myp);m_p = (char *)malloc(m_len + 1);strcpy(m_p, myp);}~Name()//析构函数{if (m_p != NULL){free(m_p);m_p = NULL;m_len = 0;}}//对象析构的时候 出现coredumpvoid objplaymain(){Name obj1("abc");Name obj2 = obj1;  //C++编译器提供的默认的copy构造函数,即浅拷贝} 

    下面提供一张图示以加强理解。


    注:当调用类似Name obj2=obj1;时,并未调用构造函数,只是调用了拷贝构造函数。

           当调用类似Name obj2;  obj2=obj1;时,调用了构造函数,生成了obj2对象,但是赋值时,还是浅拷贝。

    想要从根本上解决浅拷贝问题,就要显示提供拷贝构造函数,以及重载=操作符。代码如下。

//解决方案: 手工的编写拷贝构造函数 使用深copyName(const Name& obj1){m_len = obj1.m_len;m_p = (char *)malloc(m_len + 1);strcpy(m_p, obj1.m_p);}
    以后的编程生涯中,记住这两点对程序的正确性来说,是至关重要的。



0 0
原创粉丝点击