1,默认复制构造函数可以完成对象的数据成员值简单的复制 2,对象的数据资源是由指针指向的堆时,默认复制构造函数 仅作指针值复制 两对象共享一块内存 |
class name { public : name(char *pn) ; name( name &obj) { cout <<" copy Constructing " << endl ; char *pn = obj.getPn(); pname = (char *)malloc(strlen(pn) +1); if (pname!=NULL) strcpy(pname,pn) ; //pname = new char[strlen(pn)+1] ; //if (pname!=0) strcpy(pname,pn) ; size = strlen(pn) ; } ~ name() ; protected : char *pname ; int size ; public: char * getPn() { return pname; } void operator=(name &obj1) { cout <<" 执行=操作" << endl ; if(pname != NULL) //很必要 { Free(pname) Pname =NULL; Size = 0; } char *pn = obj1.getPn(); pname = (char *)malloc(strlen(pn) +1); if (pname!=NULL) strcpy(pname,pn) ; //pname = new char[strlen(pn)+1] ; //if (pname!=0) strcpy(pname,pn) ; pname[0] = 'm'; size = strlen(pn) ; } } ; name::name(char *pn) { cout <<" Constructing " << pn << endl ; pname = (char *)malloc(strlen(pn) +1); if (pname!=0) strcpy(pname,pn) ; //pname = new char[strlen(pn)+1] ; //if (pname!=0) strcpy(pname,pn) ; size = strlen(pn) ; } name :: ~ name() //析构函数 { cout << " Destructing " << pname << endl ; pname[0] = '\0' ; //delete []pname ; free(pname); size = 0 ; }
void playmain() { name obj1("name1"); //如果你不写copy构造函数,那么C++编译器会给我们提供一个默认的copy构造函数 (浅cpy) name obj2 = obj1;
//如果你不写=操作,那么C++编译器会给我们提供一个=操作函数 (浅cpy) obj2 = obj1; cout<<obj2.getPn()<<endl; } 注意: 等号操作和拷贝构造函数是两个不同概念,使用拷贝构造函数时,对象还没有内存空间,因此不需要判断是否有旧的内存空间没释放;使用等号操作时,对象已经有了内存空间(初始化),因此重新赋值是应当注意判断,旧的内存空间是否释放 |
深复制和浅复制
最新推荐文章于 2021-07-12 20:45:32 发布