条款16: 在operator=中对所有数据成员赋值
条款45说明了如果没写赋值运算符的话,编译器就会为你生成一个,条款11则说明了为什么你会经常不喜欢编译器为你生成的这个赋值运算符,所以你会想能否有个两全其美的办法,让编译器生成一个缺省的赋值运算符,然后可以有选择地重写不喜欢的部分。这是不可能的!只要想对赋值过程的某一个部分进行控制,就必须负责做赋值过程中所有的事。
实际编程(www.cppentry.com)中,这意味着写赋值运算符时,必须对对象的每一个数据成员赋值:
template<class t> // 名字和指针相关联的类的模板
class namedptr { // (源自条款12)
public:
namedptr(const string& initname, t *initptr);
namedptr& operator=(const namedptr& rhs);
private:
string name;
t *ptr;
};
template<class t>
namedptr<t>& namedptr<t>::operator=(const namedptr<t>& rhs)
{
if (this == &rhs)
return *this; // 见条款17
// assign to all data members
name = rhs.name; // 给name赋值
*ptr = *rhs.ptr; &n