首先, 问题抛出
#include <iostream> #include <malloc.h> #include <string.h> using namespace std; class Test{ private: char *p; int len; public: Test(const char *myp){ int len = strlen(myp); p = (char *)malloc(len+1); strcpy(p, myp); } ~Test(){ cout << "xigoule " << p << endl; free(p); p = NULL; len = 0; } }; int main() { Test obj1("dsasasd"); //情况1:浅拷贝之拷贝构造函数 Test obj2 = obj1;//用obj1去初始化obj2,在obj2没有拷贝构造函数的时候,编译器自动执行默认的拷贝构造函数,是个浅拷贝 //情况2:浅拷贝之等号操作符 obj2 = obj1;//注意区分等号与上面初始化的区别,等号是赋值,是直接将obj1赋值给obj2,不会调用构造函数。这里编译器默认的等号操作也是一个浅拷贝 return 0; }
其实情况一和情况二都是一个道理,那么这时候就需要我们程序员去手动地写拷贝构造函数(情况1)和重载等号运算符(情况2)
情况1:
class Test{ private: char *p; int len; public: Test(const char *myp){ len = strlen(myp); p = (char *)malloc(len+1); strcpy(p, myp); } Test(const Test &t){ len = t.len; p = (char *)malloc(len+1); strcpy(p, t.p); } ~Test(){ cout << "xigoule " << p << " " << len << endl; free(p); p = NULL; len = 0; } }; 情况2:加入下成员函数 void operator = (const Test& obj1){ if(this->p != NULL) {//先释放旧的内存 delete [] p; len = 0; } //根据obj1分配内存大小 this->len = obj1.len; this->p = new char [len+1]; //把obj1赋值给它 strcpy(this->p, obj1.p); }