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

类的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];

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++运算符重载-下篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 1,457评论 0 49
  • 【转载】原文地址:std::string详解作者:kieven2008 之所以抛弃char*的字符串而选用C++标...
    VAYY阅读 656评论 0 2
  • 题目类型 a.C++与C差异(1-18) 1.C和C++中struct有什么区别? C没有Protection行为...
    阿面a阅读 7,706评论 0 10
  • 京东衣锦还乡 人若成名屁亦香,一呼百应众景仰。 走在哪里掌声亮,一路鲜花喜洋洋。 君若羡慕多努力,飞上枝头变凤凰。
    陈老师_7891阅读 473评论 0 1
  • 从前 这个地方 曾经站着你 挥着手 中的思念 现在 我站在了这个 曾经站着你 的地方 寻找着那 迷失的思念 201...
    MK袁景文阅读 219评论 0 0