我们从一个例子说起,来看上一篇文章中的String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char)。

只要了解过C++的操作符重载的语法,很快就可以写出下面这个[]操作符重载函数:
char& operator[](int posion)    // function_1
 {
      return data[posion];
 };
注意,这里该函数的返回值为一个引用,否则str[0] = 'c'这样的语句就会不合法,因为str[0]将是一个左值。

那么,是否提供这样一个function_1就足够了呢?看下面这段代码:
const String str= "She";
char c = str[0];    // 错误!编译提示:error C2678: 二进制“[” : 没有找到接受“const String”类型的左操作数的运算符(或没有可接受的转换)

很显然,我们必须还要为const String提供一个const版本的opeartor[]。如下:
char& operator[](int posion) const
 {
      return data[posion];
 }
这样,当使用const的String对象使用[]操作符时,便会调用该const的重载版本。
但是,这样就OK了嘛?虽然上面的那段代码没有问题了,但是其中却隐藏了一个陷阱,看如下代码:
const String str = "She";
str[0] = 'T';
上面这段代码可以编译,运行通过,str变为了"The"!而str声明为const的!!

现在,你应该知道了,对于const的该操作符重载函数其返回值也应该是const的,否则就会出现可以通过其修改const对象的漏洞。修改如下:
const char& operator[](int posion) const
 {
      return data[posion];
 }
好了,现在没有问题了!

我们再回过头来看一下,为了给String提供一个[]操作符来读写指定位置的字符,需要提供如下两个函数,以分别对非const String对象和const String对象提供支持:
char& operator[](int posion)
 {
     return data[posion];
 };

const char& operator[](int posion) const
 {
     return data[posion];
 }

最新文章

  1. 关于js解析的一点小问题
  2. Javascript下拉导航
  3. iOS 8 牛刀小试
  4. Ruby on Rails 接口无法调试的问题
  5. input 标签实现带提示文字的输入框
  6. Unity开发游戏 flapybird 无广告老马版分享
  7. CVE-2013-3908 Internet Explorer打印预览功能可导致信息泄露
  8. Linux磁盘空间被未知资源耗尽【转】
  9. 插入排序InsertionSort
  10. wikioi3363支线剧情(挖个坑,不会做。。。)
  11. 九度OJ 1025 最大报销额(01背包)
  12. Git安装使用
  13. CentOS 7 rsync
  14. stylus 实践
  15. C#程序以管理员权限运行(ZT)
  16. js判断当前内容是否为空
  17. jquery操作checkBox 一次取消选中后不能再选中
  18. WPF中TextBox文件拖放问题
  19. noip第12课资料
  20. 004_加速国内docker源下载速度

热门文章

  1. 在CentOS7命令行模式下安装虚拟机
  2. 洛谷P2801 教主的魔法 [分块,二分答案]
  3. disconf-client-for-java
  4. Java Web开发——JSP基本语法杂记
  5. xss可用事件
  6. BZOJ4552 HEOI2016排序
  7. [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
  8. dcoker常用命令
  9. Hash表及hash算法的分析
  10. SPFA cojs 176. [USACO Feb07] 奶牛聚会