拷贝构造函数,浅拷贝和深拷贝
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 ; }

浙公网安备 33010602011771号