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

class AA
{
public:
    AA() //无参构造函数 默认构造函数
    {    
        cout<<"我是构造函数,自动被调用了"<<endl;
    }
    AA(int _a) //无参构造函数 默认构造函数
    {    
        a = _a;
    }
     AA(const AA &obj)
     {
         cout<<"我也是构造函数,我是通过另外一个对象obj2,来初始化我自己"<<endl;
         a = obj2.a + 10;
     }
    ~AA()
    {
        cout<<"我是析构函数,自动被调用了"<<endl;
    }
    void getA()
    {
        printf("a:%d \n", a);
    }
protected:
private:
    int a;
};
void ObjPlay()
{
    AA a1(10); //变量定义
    //赋值构造函数的第一个应用场景
    //用对象1 初始化 对象2 
    AA a2(a1); //定义变量并初始化 //括号法
    //a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy
    a2.getA();
}

浅拷贝和深拷贝

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>
using namespace std;
class  Name
{
public:
    Name(const char *myp)
    {
        m_len = strlen(myp);
        m_p =(char *) malloc(m_len + 1); //
        strcpy(m_p, myp);
    }

    //Name obj2 = obj1;
    //解决方案: 手工的编写拷贝构造函数 使用深copy
    Name(const Name& obj1)
    {
        m_len = obj1.m_len;
        m_p = (char *)malloc(m_len + 1);
        strcpy(m_p, obj1.m_p);
    }
    ~Name()
    {
        if (m_p != NULL)
        {
            free(m_p);
            m_p = NULL;
            m_len = 0;
        }
    }
protected:
private:
    char *m_p ;
    int m_len; 
};
//对象析构的时候 出现coredump
void objplaymain()
{
    Name obj1("abcdefg");
    //Name obj2 = obj1;  //C++编译器提供的 默认的copy构造函数  浅拷贝,如果手工的编写拷贝构造函,使用深copy
    Name obj3("obj3");

    obj3 = obj1;  // C++编译器提供的 等号操作 也属 浅拷贝
}
void main()
{
    objplaymain();
    cout<<"hello..."<<endl;
    system("pause");
    return ;
}

 

posted @ 2018-03-16 09:02  Alexadar  阅读(222)  评论(0)    收藏  举报