const重载”是做什么用的?


当一个查看函数和一个变更函数名字相同,且参数个数与类型也相同时就有用了——即两者的不同之处仅在于一个有const另一个没有const。

const重载的一个常见应用是下标运算符。通常应该尽量使用标准模板容器,例如std::vector,但有时会需要在自己的类中支持下标运算符。一个经验法则是:下标运算符通常成对出现。

class Fred { ... };
class MyFredList {
public:
const Fred& operator[] (unsigned index) const; ←下标运算符通常成对出现
Fred& operator[] (unsigned index); ←下标运算符通常成对出现
...
};

当对一个非const的MyFredList对象使用下标运算符时,编译器会调用非const的下表运算符。因为返回的是一个普通 Fred&,所以能够查看或修改对应的Fred对象。例如,假设Fred类有一个查看函数Fred::inspect() const和一个变更函数Fred::mutate():

void f(MyFredList& a) ← MyFredList是非const的
{
// 可以调用不修改a[3]处Fred对象的方法:
Fred x = a[3];
a[3].inspect();
// 可以调用修改a[3]处Fred对象的方法:
Fred y;
a[3] = y;
a[3].mutate();
}

但是,当对一个const的MyFredList对象使用下标运算符时,编译器会调用const的下标运算符。因为会返回const Fred&,所以可以查看对应的Fred对象而不能修改它。

void f(const MyFredList& a) ← MyFredList是const的
{
// 可以调用不修改a[3]处Fred对象的方法:
Fred x = a[3];
a[3].inspect();
// 错误(很幸运!):试图改变a[3]出的Fred对象:
Fred y;
a[3] = y; ← 幸运的是编译器在编译时发现了这个错误。
a[3].mutate(); ← 幸运的是编译器在编译时发现了这个错误。
}
posted @ 2009-11-09 02:48  史莱姆  阅读(335)  评论(0编辑  收藏  举报