C++中重载下标运算符[]

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 取下标返回的是常量引用
}
  1. 返回值类型& operator[] (参数列表);

  2. const 返回值类型 & operator[] (参数列表) const;

  3. 使用第一种声明方式,[]不仅可以访问元素,还可以修改元素。

  4. 使用第二种声明方式,[]只能访问而不能修改元素。在实际开发中,应该同时提供以上两种形式。

  5. 这样做是为了适应const对象,因为通过const对象只能调用const成员函数,如果不提供第二种形式,那么将无法访问const 对象的任何元素。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

你可能感兴趣的:(CC++编程要点,c++)