lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
何时需要自定义拷贝构造函数及其他(三法则)
2018-09-20 12:23:48
328
0
0
lee-romantic
**** //自定义拷贝构造函数 classname(const classname &ob) { //自定义拷贝构造函数的函数体 } // 其中ob是用来初始另一个对象的对象的引用 ***** ``` class StringData{ private: char *str; public: StringData(char *s){ str=new char[strlen(s)+1]; strcpy(str,s); } StringData(const StringData &p){ str=new char[strlen(p.str)+1]; strcpy(str,p.str); } ~StringData() { delete str; } //… }; int main() { StringData x(“abc”); StringData y(x); getchar(); return 0; } ``` **说明**: 拷贝构造函数是一种特殊的构造函数。它用于依据已存在的对象建立一个新对象。 如果一个对象里面有指针成员,并且这个指针已经动态分配空间了,同时,对象有析构函数对这个指针进行释放。如上面那个例子,如果我们通过这个对象创建一个新对象: A a("123"); A b = a; // 调用拷贝构造函数 如果我们没有自定义拷贝构造函数,导致对象 a 和 b 的指针成员指向同一个地址空间,当对象生命周期结束时,a 和 b 都会调用析构函数,最后导致,这个指针会被释放 2 次,导致内存出问题。 > 引用 ---------- 在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。 **深拷贝和浅拷贝**可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。 **所以,对象有指针成员,尽量自定义拷贝构造函数。**
上一篇:
构造函数和析构函数中调用虚函数
下一篇:
指针赋值的理解
0
赞
328 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册