String的赋值函数operator=的实现如下:
CMystring& CMystring::operator=( const CMystring& other ) { if( this == &other ) // 检查自身赋值 { return *this; }
if( m_data != NULL ) { delete []m_data; // 释放原有的空间 m_data = NULL; }
m_data = new char[ strlen(other.m_data)+1 ]; if( m_data == NULL ) { cout << "不能分配空间!" << endl; } else { strcpy( m_data, other.m_data ); return *this; }
}
如果用值返回,也可以,但由于return 语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,调用此函数时例如:
String a;
String b;
String c;
// 下面这句 a = b; 如果用值传递,会产生一次*this的拷贝
a = b; // 虽然调用此函数时没有用一个变量用来保存返回值,但仍然会生成一个临时变量来保存返回的值,然后这个临时变量在此语句执行完后就释放了。
a = b = c; // 会产生两次*this的拷贝
故能用引用传递,尽量用引用传递。