C++ 之 赋值函数(操作符)

  • Post author:
  • Post category:其他


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



版权声明:本文为qq_35865125原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。