• 条款3:尽可能地使用const


    如下为const修饰的几种类型:

    char name[] = "benxintuzi";

    char* p1 = name;                // non-const pointer, non-const data

    const char* p2 = name;         // non-const pointer, const data

    char* const p3 = name;         // const pointer,      non-const data

    const char* const p4 = name;  // const pointer,      const data

    小技巧:

    如果const出现在*号左边,就是non-const pointer, const data;如果出现在*号右边,就是const pointer, non-const data。

     

    const的另外一个用途就是修饰函数:const可以修饰返回值、参数、函数本身。

    现在定义一个类TextBlock操作一个字符串的某个字符:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 class TextBlock
     6 {
     7 public:
     8     TextBlock(string text)
     9     {
    10         this->text = text;
    11     }
    12     const char& operator[](size_t position) const   // 操作常量对象
    13     {
    14         return text[position];
    15     }
    16     char& operator[](size_t position)               // 操作非常量对象
    17     {
    18         return text[position];
    19     }
    20 
    21 private:
    22     string text;
    23 };
    24 
    25 
    26 int main()
    27 {
    28     TextBlock name("benxintuzi");
    29     cout << name[0];                    // 调用non-const类型的operator[]
    30     name[0] = 'B';                      // 正确
    31     const TextBlock cname("tuzi");
    32     cout << cname[0];                   // 调用const类型的operator[]
    33     cname[0] = 'T';                     // 错误
    34 
    35     return 0;
    36 }

    注意:

    上边的重载[]操作符返回的是char&,而不是char,否则name[0] = 'B'这样的语句就不能通过编译。究其原因就是如果返回一个内置类型,那么改变其值是不好的,因此C++不会同样这样做,即使有些编译器可以通过,那么最终你改变的也只是一个副本而已,原始的字符并没有改变(因为如果不返回引用,只是返回类型本身的话,C++会调用复制构造函数返回一个副本而已)。

     

    如果我们可以确定成员函数不会改变对象的任何变量,那么我们就可以将函数声明为const,就是:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 class TextBlock
     6 {
     7 public:
     8     size_t stat() const;
     9 
    10 private:
    11     int length;
    12     bool use;
    13 };
    14 size_t TextBlock::stat() const    // const函数表示不会改变对象中的所有变量
    15 {
    16     use = true;
    17     length = 10;
    18     return length;
    19 }
    20 
    21 int main()
    22 {
    23     TextBlock tb;
    24     cout << tb.stat() << endl;    // assignment of member ‘TextBlock::use’ in read-only object ...
    25     return 0;
    26 }

    但若是我们想在const函数中改变某个特殊成员变量怎么办呢?利用mutable对变量进行修饰即可:

    1 class TextBlock
    2 {
    3 public:
    4     size_t stat() const;        // const函数表示不会改变对象中的所有变量
    5 
    6 private:
    7     mutable int length;
    8     mutable bool use;
    9 };
  • 相关阅读:
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    oracle数据库教程从入门到精通
    ORA01078: failure in processing system parameters 启动oracle数据库时报错
    Linux中文显示乱码问题以及中文输入法安装问题
    .tar.xz文件的解压
    两个rpm文件包存在互相依赖关系时,需要同时安装,解决办法如下
    #include sys/xxx.h头文件说明
    Linux下DIR_dirent_stat等结构体详解
    创建共享无线网
    Linux 磁盘“Block Size”研究
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4535282.html
Copyright © 2020-2023  润新知