C++赋值运算符
C当中允许类对象赋值这是通过默认的重载赋值运算符实现的它的原型如下1Class_name Class_name::operator(constClass_name );它接受并返回一个指向类对象的引用。将已有的对象赋给另一个对象时将会使用重载的赋值运算符1234StringBad headline1(Celery);StringBad knot;knot headline1;// 调用赋值运算符如果是对象初始化的过程则不一定会使用赋值运算符比如1StringBad metoo knot;像是这种情况很难说因为metoo是一个新建的对象它可以使用拷贝构造函数。然而也可以分成两步来处理先使用拷贝构造函数创建一个临时对象然后在赋值的时候使用赋值运算符复制到新对象中去也是可以的。和拷贝构造函数类似默认赋值运算符的实现也是对成员进行逐个复制。如果成员本身就是累对象那么会使用这个类的赋值运算符来复制。赋值运算符的问题在哪里呢我们还是看下之前StringBad那个例子我们看下下面这段代码1234StringBad sb(test);StringBad sports(Spinach Leaves Bowl for Dollars);StringBad knot;knot sports;当我们运行的时候就会遇到这样的报错报错的原因日志里写得很清楚我们尝试释放一个没有被分配的内存。会报错的原因很简单因为我们执行knot sports的时候两个对象内部的字符串指向的是同一个地址。这就导致了析构knot的时候sports对象对应的内容已经不存在了。解决方案也很简单就是我们自己重载赋值运算符保证不会出现简单拷贝的问题。12345678StringBad StringBad::operator (constStringBad st) {if(this st)return*this;delete[]str;len st.len;str newchar[len1];std::strcpy(str, st.str);return*this;}