标签:
默认的这两个函数仅仅是将对象的成员进行简单赋值。
这就意味着,如果该类的成员是指针类型,那么当该类的两个对象之间发生赋值后,这两个对象中的指针就会指向同一片内存区。这种情况下,内存管理就会复杂起来,后面的文章中会详细讲解如何解决这个问题 - 在类的不同对象之间共享内存区。
有时候,如果你不需要在内存中实现共享,完全可以自行定义这两个函数,为被赋值的对象分配新的内存区。
那么,如果类成员是引用类型呢?如果对象之间成员只是简单的复制,那么岂非出现一个引用型变量引用了新的变量?这是违反 C++ 的”不允许引用型变量改指向不同的对象“这一原则的。
class baseclass{ private: baseclass(){} ~baseclass(){} public: baseclass(const baseclass &); baseclass & operator =(const baseclass &); }; class myclass :private baseclass{ };
Class::~Class(){ try{ db.close(); }catch(...){ std::abort(); } }
②:吞下因为调用而产生的异常
Class & operator = (cosnt Class & rhs){//返回一个引用reference this.rhs=rhs; //指向当前对象 return *this; //返回左侧的对象 }
widger& widget::operator=(const widget & rhs){//一份不安全的=版本 delete pb; //其中。bitmap *pb; 停止使用当前的bitmap pb=new bitmap(*rhs.pb);//使用rhs的副本pb return *this; //这里可能rhs和this是同一个对象 } //增加认同测试的改正版 widger& widget::operator=(const widget & rhs){//一份不安全的=版本 if (this==&rhs)return *this;//这个版本还是存在异常的问题,如果new bitmap出现异常,指针会指向一块已经被delete的部分, delete pb; pb=new bitmap(*rhs.pb); return *this; } //处理异常的方法,同时也可以解决自我赋值的问题 widger& widget::operator=(const widget & rhs){ bitmap *o=pb;//新建一个指针记住原来的pb指针所指对象 pb=new bitmap(*rhs.pb);//进行赋值操作 delete o;//删除原来的指针所指的内容和指针 return *this; } //最完整的写法 class widget{ void swap(widget &rhs);//交换函数 }; widger& widget::operator=(const widget & rhs){ widget temp(rhs);//赋值构造函数,产生临时的指针变量 swap(temp); return *this; }
标签:
原文地址:http://www.cnblogs.com/Kobe10/p/5736036.html