【发布时间】:2017-10-26 18:53:51
【问题描述】:
在下面的代码示例中,因为我比较了两个std::map 对象,所以我不得不实现MyId::operator==()。
MyId 是一个简单的类:基本上是一个数组的包装器。这让我想知道为什么要求使用相等运算符:为什么不给我们一个默认的按位比较器?毕竟,我们有一个默认的赋值运算符,它在对象之间进行 bitwise 成员复制。
我了解深拷贝和浅拷贝之间的区别以及需要赋值和相等运算符。我的问题是为什么有默认赋值时没有默认的“按位相等检查”?
#include <iostream>
#include <map>
#include <cstring>
typedef int myid[ 3 ];
struct MyId
{
myid id_;
bool operator<( const struct MyId& other ) const { return this < &other; }
bool operator==( const struct MyId& other ) const
{
return ( 0 == std::memcmp( id_, other.id_, sizeof( myid ) ));
}
};
int main( int argc, char* argv[] )
{
std::map< MyId, int> map;
MyId id = { 1, 2, 3 };
map[ id ] = 5;
std::map< MyId, int> map2;
map2[ id ] = 5;
// This forces implementation of MyId::operator==():
std::cout << std::boolalpha <<( map == map2 ) << std::endl;
MyId i1 = { 4, 5, 6 };
MyId i2 = { 7, 8, 9 };
// No required implementation of MyId::operator=():
i1 = i2;
return 0;
}
更新:公开更正了我的脑屁 RE:按位与按成员默认赋值运算符。
【问题讨论】:
-
赋值运算符和复制构造函数进行成员复制 - 不是按位复制。
标签: c++ operator-overloading assignment-operator equality-operator