当写一个赋值运算符函数时,首先要关注几点(第一种写法):
1.返回值的类型是不是应该声明为该类型的引用,并在函数结束前返回实例自身的引用,只有这样,才支持连续赋值例如3个list的实例l1,l2,l3,语句l1=l2=l3编译通过。
2.实例自身已有的内存是不是应该释放,如果在分配内存之前没有释放,程序将出现内存泄漏。
3.传入的参数是不是应该应该声明为常量引用以避免实参传给形参时调用拷贝构造函数的无谓消耗。
4.是不是应该判断this跟传入的形参是否为同一个实例,否则,当两者为同一个实例时,当释放了原来的内存后,就找不着需要赋值的内容了。
例:(string的赋值运算符重载)
String:String& operator=(const String & str)
{
if(this !=&str)
return *this;
char *tmp=new char[strlen(str._str)+1]; //用临时变量指向新开辟的空间,避免了开辟新空间失败时对原实例的破环(对原实例开辟空间先得释放原来的内存)
strcpy(tmp,str._str);
delete[]_str;
_str=tmp;
return *this;
}
第二种:
传入的参数直接声明一个实例
例:(string的赋值运算符重载)
String:String & operator(String str)
{
swap(_str,str._str);
return *this;
}
当是这种类型的时候就不用管内存释放问题,它会调用析构函数。