1. 作用
赋值运算符"="的作用是将一个表达式的值赋给一个左值。
2. 一般形式
A&A::operaton=(A &a)
{
if(this == &a) //自检查
return *this;
...... //将a的成员赋给自己
return *this;
}
特别需要注意的是如果A是一个派生类,则在赋值成员前需要调用基类的赋值函数:base::operator=(rhs);
3. 返回引用的原因
因为赋值运算符会改变左值,所以赋值运算符重载要返回引用以用于类似(a = b) = c;这样连续赋值的情形。
4. 重载时只能作为成员函数
赋值运算符重载时只能是成员函数,如果允许operator=为全局的,那么将会导致重新定义内置的"=":
int operator=(int , MyType); //即将非int赋给int变量
这种做法是不允许的,编译器通过强制operator=为成员函数来避开这个问题。当创建一个operator=时,必须从右侧对象中拷贝所以需要的信息到当前对象。
5. 需要自检查的原因
String& String::operate=(const String &other)
{
if(this==&other)
return *this;
delete []m_data;
int length=strlen(other.m_data);
m_data=new char[lenght+1];
strcpy(m.data,other.m_data);
return *this;
}
对应上面的code,如果没有做自检查,那么首先会去释放原来的内存资源,在拷贝,这样显然是错误的。
有些情况不做自检查也是可以的,但最好还是加上(这样做不会带来麻烦, 最起码省去了给成员赋值的操作,对性能可能会有一点提升)