类的const和非const成员函数的重载

原创 2007年10月10日 21:20:00

类的const和非const成员函数的重载

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

Const 重载解析(const参数重载 和 const成员函数重载)

书上和网上在很多地方都对const 的重载做了一些解释,但感觉都不是很详细。还有很多同学在不同的地方发问关于const 重载的问题,这里我又重新看了一下,做了一个简单的分析也可能有不对的地方,欢迎讨论...
  • net_assassin
  • net_assassin
  • 2013年08月16日 10:26
  • 4338

C++中const成员函数和非const成员函数的重载

函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载。注意函数重载不能基于不同的返回值类型进行重载。 注意函数重载中的“形参表”不同,是指本质不同...
  • bzhxuexi
  • bzhxuexi
  • 2015年02月02日 14:30
  • 2434

为什么const对象只能调用const成员函数,而不能调用非const成员函数?

参考:http://www.cnblogs.com/cplinux/articles/5553716.html 在c++中,我们可以用const来定义一个const对象,const对象是不可以调用...
  • nawuyao
  • nawuyao
  • 2016年10月07日 11:49
  • 1306

类中const函数及非const函数的调用规则

转自:点击打开链接 类中const函数及非const函数的调用规则 class Student { public: int getAge() ...
  • zjcxhswill
  • zjcxhswill
  • 2016年01月30日 16:20
  • 1601

C++那些细节--const与函数

const是C++中灰常灰常强大的关键字。const--constant的缩写,简单理解就是不变的意思,它的所有功能都是限定我们修改某个变量。虽然我们最熟悉的是const常量,但是这并不是const最...
  • puppet_master
  • puppet_master
  • 2015年09月30日 15:26
  • 1534

普通函数和类成员函数const重载

函数参数的const重载只能重载引用型的,因为非引用的const和普通的非const参数一样。 成员函数用const重载总共有三种方式,有三个地方可以写const,要注意const在不同的地方的意义...
  • u010585135
  • u010585135
  • 2015年03月28日 10:34
  • 378

类的const和非const成员函数的重载

类的const和非const成员函数的重载 我们从一个例子说起,来看上一篇文章中的String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char)。 只要了解过C++...
  • pizi0475
  • pizi0475
  • 2015年07月13日 20:21
  • 336

C++学习笔记(5)----类的const和非const成员函数的重载

类的const和非const成员函数的重载 我们从一个例子说起,来看上一篇文章中的String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char)。 只要了解过C++...
  • johnsonlrd
  • johnsonlrd
  • 2012年07月26日 11:49
  • 338

类的const和非const成员函数的重载

1. 类的const成员函数与非const成员函数的重载 #include #include using namespace std; class Person { public: Pe...
  • zgh1988
  • zgh1988
  • 2013年05月08日 16:49
  • 1033

类的const和非const成员函数的重载

原文地址: http://blog.csdn.net/anjy/article/details/1819126 类的const和非const成员函数的重载 我们从一个例子...
  • u012579879
  • u012579879
  • 2013年11月05日 00:24
  • 557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类的const和非const成员函数的重载
举报原因:
原因补充:

(最多只允许输入30个字)