博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类的const和非const成员函数的重载
阅读量:6913 次
发布时间:2019-06-27

本文共 1112 字,大约阅读时间需要 3 分钟。

我们从一个例子说起,来看上一篇文章中的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];
 }

本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/3410017.html,如需转载请自行联系原作者

你可能感兴趣的文章
I.MX6 USB Camera
查看>>
MySQL 存储过程理解
查看>>
linux C 数组操作
查看>>
g++编译后中文显示乱码解决方案(c++)
查看>>
Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Rand forest 和 gradient boosting的区别
查看>>
Java面试题考点全面总结
查看>>
Python使用python-nmap模块实现端口扫描器
查看>>
梦断代码阅读笔记(1)
查看>>
2015年10月之 叽里咕噜
查看>>
HDU 5495:LCS
查看>>
Linux下访问网站
查看>>
字符串常用方法python
查看>>
C# Random 生成不重复随机数
查看>>
推荐一些好的linux学习网站
查看>>
tomcat一闪而过,无法开启
查看>>
setInterval() 方法应用
查看>>
WPF(命令参数)
查看>>
iOS MVVM 前世今生
查看>>
tomcat 安全文件夹(Java之负基础实战)
查看>>
IO---Java 文件复制
查看>>