string c = "hello";
a和c具有相同值,所以它们被认为是完全相同的;b和它们都不同。如果把这个定
义用到string类中,赋值运算符看起来就象这样:
string& string::operator=(const string& rhs)
{
if (strcmp(data, rhs.data) == 0) return *this;
...
}
值相等通常由operator==来检测,所以对于一个用值相等来检测对象身份的类c来
说,它的赋值运算符的一般形式是:
c& c::operator=(const c& rhs)
{
// 检查对自己赋值的情况
if (*this == rhs) // 假设operator=存在
return *this;
...
}
注意这个函数比较的是对象(通过operator=),而不是指针。用值相等来确定对
象身份和两个对象是否占用相同的内存没有关系;有关系的只是它们所表示的值。
另一个确定对象身份是否相同的方法是用内存地址。采用这个定义,两个对象当且
仅当它们具有相同的地址时才是相同的。这个定义在c++程序中运用更广泛,可能
是因为它很容易实现而且计算很快,而采用值相等的定义则不一定总具有这两个优
点。采用地址相等的定义,一个普通的赋值运算符看起来象这样:
c& c::operator=(const c& rhs)
{
// 检查对自己赋值的情况
if (this == &rhs) return *this;
...
}
它对很多程序都适用。
如果需要一个更复杂的机制来确定两个对象是否相同,这就要靠程序员自己来实现
。最普通的方法是实现一个返回某种对象标识符的成员函数:
class c {
public:
objectid identity() const; // 参见条款36
...
};
对于两个对象指针a和b,当且仅当 a->id