在看STL unordered_map的源码时,看到下面一段代码的时候产生了疑惑:
iterator find(const key_type& _Keyval)
{ // find an element in mutable hash table that matches _Keyval
return (lower_bound(_Keyval));
}
const_iterator find(const key_type& _Keyval) const
{ // find an element in nonmutable hash table that matches _Keyval
return (lower_bound(_Keyval));
}
这两个函数都是unordered_map的成员函数,乍一看,其函数名和形参列表都是相同的,只有返回值不同,然后心中升起疑问,这样的重载合法吗?
仔细看,发现第二个函数后面还有一个 const,然后去网上查了下资料,才知道还有constant重载。
声明类成员函数时,总有一个我们“看不见”的参数,它就是this指针,const重载的实质是,将this指针声明为了const类型,即上述两个函数的参数表其实还是不一样的。
下面举个简单的例子来说明:
class constOverload
{
public:
int test()
{
cout << 1 << endl;
return 1;
};
bool test() const
{
cout << 0 << endl;
return false;
};
constOverload()
{
test(); //输出1
const constOverload* p = this;
p->test();//输出0
}
}