——C++允许类对象赋值,这是通过自动为类重载赋值运算符实现的,原型如下:
Class_name & Class_name_name::operator=(const Class_name &);
将已有的对象赋给另一个对象时,将使用重载的赋值运算符,初始化对象时,并不一定会使用赋值运算符
StringBad metoo = knot; // use copy constructor, possibly assignment, too
使用复制构造函数,或实现时分两步:使用复制构造函数创建一个临时对象,然后通过赋值将临时对象的值复制到新对象中
与隐式复制构造函数相同:浅复制导致指针指向的内存数据受损(内存区被得到值的对象修改或调用析构函数被释放内存)
解决办法:大体与复制构造函数相同,又有细微差别
StringBad &StringBad::operator=(const StringBad &st) { if (this == &st) // 检查自我复制 return *this; delete []str; len = st.len; str = new char [len + 1]; std::strcpy(str, st.str); return *this; }
代码首先检查自我复制
为提高效率,如果经常使用标准类型等可转换为类类型的赋值,则首先考虑重载一个完全匹配的赋值运算符,以避免创建和释放临时对象消耗多余的执行时间和内存
原文:https://www.cnblogs.com/suui90/p/13127155.html