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

原创 2012年03月27日 16:05:41

我们从一个例子说起,来看上一篇文章中的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重载总共有三种方式,有三个地方可以写const,要注意const在不同的地方的意义...

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

原文地址: http://blog.csdn.net/anjy/article/details/1819126 类的const和非const成员函数的重载 我们从一个例子...

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

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

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

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

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

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

const 成员函数重载

先看一段引用[1]: 许多人漠视一件事实:两个成员函数如果只是常量性(constess)不同,可以被重载 ok,下面为了解释,定义一下下面这个类:class Cstring { priva...

C++重载运算符及const成员函数简述

ACM中,用重载函数会使解题更加方便,但是又需要像c++那样深入理解,遂简单总结了结构体中的重载运算符及const成员函数一些简单的用法. 闲言少叙,直接看代码: /** * 行有余力,则来刷...

C++重载下标操作符const & nonconst 成员函数使用比较

这两天在自己尝试写向量和矩阵运算的类,之前一直用C,对C++的类特性不是 很熟,在重载操作符时遇到了一些问题。这里就说说在重载下标操作符时,对const对象和非const对象使用下标我的一些学习经历...

C++的const类成员函数

转自http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类的const和非const成员函数的重载
举报原因:
原因补充:

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