C++中重载下标运算符[]
表示容器的类通常可以通过元素在容器中的位置访问元素,这些类一般会定义下标运算符 operator[]
。
下标运算符必须是成员函数
为了与下标的原始定义兼容,下标运算符通常以所访问元素的引用作为返回值,这样做的好处是下标可以出现在赋值运算符的任意一端。
进一步,我们最好同时定义下标运算符的常量版本和非常量版本,当作用于一个常量对象时,下标运算符返回常量引用以确保我们不会给
返回的对象赋值。
如果一个类包含下标运算符,则它通常会定义两个版本:一个返回普通引用另一个是类的常量成员并且返回常量引用。
举个例子,我们按照如下形式定义strVec(参见13.5节第465页)的下标运算符
class StrVec
{
public:std::string& operator[](std::size_t n){return elements[n];}const std::string& operator[](std::size_t n) const{return elements[nl; }
private:std::string *elements; // 指向数组首元素的指针
}
上面这两个下标运算符的用法类似于 vector 或者数组中的下标。因为下标运算符返回的是元素的引用,所以当 strVec 是非常量时,我们
可以给元素赋值:而当我们对常量对象取下标时,不能为其赋值:
//假设 svec 是一个 StrVec 对象
const StrVec cvec = svec; //把 svec 的元素拷贝到cvec中
//如果svec中含有元素,对第一个元素运行 string 的 empty 函数
if (svec.size() && svec[0].empty()) {svec[0]="zero"; //正确:下标运算符返回 string 的引用cvec[0]="Zip"; //错误:对 cvec 取下标返回的是常量引用
}
-
返回值类型& operator[] (参数列表);
-
const 返回值类型 & operator[] (参数列表) const;
-
使用第一种声明方式,[]不仅可以访问元素,还可以修改元素。
-
使用第二种声明方式,[]只能访问而不能修改元素。在实际开发中,应该同时提供以上两种形式。
-
这样做是为了适应const对象,因为通过const对象只能调用const成员函数,如果不提供第二种形式,那么将无法访问const 对象的任何元素。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器