zoukankan      html  css  js  c++  java
  • 类的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];
     }

  • 相关阅读:
    通过PMP了
    VBA之自动建立连接
    从头学SQL Server2005之一:数据库引擎体系结构
    SMP、NUMA、MPP体系结构介绍【转】
    将Windows2003的RDP客户端管理应用于XP
    VBA中简单修改原有公式的宏
    各种Excel VBA的命令
    领导和管理的区别在哪里?【转】
    COM(VB/VBA/Script)利用服务标记调用WCF服务之四:使用配置文件
    2009年第一篇日志
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/3410017.html
Copyright © 2011-2022 走看看