【C++基础】第七十九课:[重载运算与类型转换]下标运算符
·
【C++基础】系列博客为参考《C++ Primer中文版(第5版)》(C++11标准)一书,自己所做的读书笔记。
1.下标运算符
表示容器的类通常可以通过元素在容器中的位置访问元素,这些类一般会定义下标运算符operator[]。
下标运算符必须是成员函数。
为了与下标的原始定义兼容,下标运算符通常以所访问元素的引用作为返回值,这样做的好处是下标可以出现在赋值运算符的任意一端。进一步,我们最好同时定义下标运算符的常量版本和非常量版本,当作用于一个常量对象时,下标运算符返回常量引用以确保我们不会给返回的对象赋值。
举个例子,我们按照如下形式定义StrVec的下标运算符:
class StrVec {
public:
std::string& operator[](std::size_t n) { return elements[n]; }
const std::string& operator[](std::size_t n) const { return elements[n]; }
//其他成员与之前定义一致
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取下标返回的是常量引用
}
想要获取最新文章推送或者私聊谈人生,请关注我的个人微信公众号:⬇️x-jeff的AI工坊⬇️

个人博客网站:https://shichaoxin.com
GitHub:https://github.com/x-jeff
更多推荐
所有评论(0)