c++允许类对象之间赋值,这是通过自动为类重载赋值操作符实现的。
这种操作符地原型如下:
className & className::operator = (const className &);
入参和返回值都是 指向类对象地引用。
当 将一个已经存在的对象赋给另一个对象时,将使用重载的赋值操作符。赋值操作符并不创建新的对象。
例如:
StringBad obj1;
StringBad obj2;
obj2 = ojb1; /
/调用赋值操作符函数
与复制构造函数类似,赋值操作符的隐式实现也是对类成员逐个浅复制。如果成员本身是类对象,则程序将使用为这个类定义的赋值操作符来复制该成员,但静态数据成员不受影响。
与复制构造函数类似,编译器提供的默认赋值操作符存在类似的问题。解决办法是为类提供 赋值操作符(进行深度复制)。其实现与复制构造函数相似,但是也有一些差别:
1)由于目标对象(=左侧的对象) 可能引用了以前分配的数据,所以函数应使用delete[]来释放这些数据;
2) 应当避免给对象自身赋值; 否则,给对象赋值之前的释放内存的动作可能删除对象的内容。
3) 函数返回一个指向调用对象的引用。
通过返回一个对象,函数可以像常规赋值操作那样,连续进行赋值,即如果 s0,s1,s2都是StringBad对象,则可以编写这样的代码:
s0 = s1 = s2;
使用函数表示法时,对应: s0.operator=( s1.operator( s2 ) )
例子:为StringBad类编写赋值操作符:
StringBad
& StringBad::operator= (const StringBad & st)
{
if(this == &st)
//判断下是否是给自己赋值
return *this;
delete[] str ;
//释放本来的空间,,str是一个char*指针;
len = str.len;
str = new char[len + 1];
// get space for new string
std::strcpy(str, st.str);
//copy the string
return *this;
//return reference to invoking object
}
Ref:
《C++ Primer Plus, 第五版》–12.1.2