C++中自定义的类一般都会重载赋值运算函数,重载时候应该注意一下几点:
1. 返回类型
- 必须为该类型的引用
- 原因:必须返回一个引用,才可以允许连续赋值 ;
- 必须返回自身实例的引用(*this)
2. 参数
- 传入参数申明为常量引用
- 如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数;
- 传入参数和当前的实例(*this)是否为同一实例.
3. 释放实例自身已有的类型,防止内存泄露;
4. 考虑当因内存不足在new char时候抛出异常
4. 考虑当因内存不足在new char时候抛出异常
以string为例,以下为两个版本的重载赋值运算符的代码:
Reference
string& string::operator=(const string& str){
if( this==&str )
return *this;
delete []data;
m_data = null;
m_data = new char[ strlen(str.data)+1] ;
strcpy(data, str.data);
return *this;
}
delete后
防止
因空间不足导致new char失败导致的异常;
string& string::operator=(const string& str){
if( this != &str){
string temp(str);
char *p = temp.data;
temp.data = data;
data = p;
}
return *this;
}
Reference
《effective c++》 item 5 -- 12