码迷,mamicode.com
首页 > 其他好文 > 详细

条款3:尽可能地使用const

时间:2015-05-28 10:49:19      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

如下为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 };

 

条款3:尽可能地使用const

标签:

原文地址:http://www.cnblogs.com/benxintuzi/p/4535282.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!