类的const和非const成员函数的重载
来源:互联网 发布:越南第三军事强国知乎 编辑:程序博客网 时间:2024/04/30 08:23
转自:http://blog.csdn.net/anjy/article/details/1819126
我们从一个例子说起,来看上一篇文章中的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];
}
注:this指针是一个const指针,地址不能改,但能改变其指向的对象或者变量)
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- C++学习笔记(5)----类的const和非const成员函数的重载
- C++中const成员函数和非const成员函数的重载
- C++中const成员函数和非const成员函数的重载
- 在类中const成员函数和非const成员函数可以作为重载成员函数同时存在
- const成员函数和非const的成员函数之间的调用
- const成员函数和非const成员函数返回引用的问题
- const 和 非const函数重载
- const 和非 const 函数重载
- const 和 非const函数重载
- const成员函数的重载问题
- C++的const类成员函数(解释为什么非const成员函数不能访问const对象的数据成员)
- C++中类的const成员函数和const对象
- UVA 12300 - Smallest Regular Polygon(计算几何)
- iOS数据持久化
- js判断移动,平板跳转页面
- iOS开发-文件管理(一)
- sphinx中文分词检索 如何让分词的精确度更高
- 类的const和非const成员函数的重载
- Python核心编程阅读笔记(一)
- android开发———数据存储之SharedPreferences
- lucene nutch solr及hadoop的区别和联系
- 第一章
- 关于JQuery重复绑定的问题
- ThreadLocal用法和实现原理
- 重温B/S所学知识(一)—HTML
- SVN 删除文件后 tree conflict