当前位置:主页   - 电脑 - 程序设计 - C/C++
《Effective C++》读书笔记03:多才多艺的const
来源:网络   作者:   更新时间:2011-11-07
收藏此页】    【字号    】    【打印】    【关闭

  const是我们写c++代码时的常客,对于那些我们不希望修改的对象,最好用const进行修饰。

  1.下面来看看一些惯用法:

1 char greeting[] = "Hello";
2 char* p = greeting;             //非const指针,非const数据
3 const char* p = greeting;       //非const指针,const数据
4 char const *p = greeting;       //非const指针,const数据
5 char* const p = greeting;       //const指针,非const数据
6 const char* const p = greeting; //const指针,const数据

  3和4行虽然形式不同,不过功能是类似的。

  3和5有本质的不同,可以这么理解:const会修饰在它后面所有的代码,比如第3,4中的const修饰char* p,表示char*,而在第5中const修饰p,表示指针。

  可这些在STL中有所不同,由于iterator是一个指针,用const修饰一个iterator会类似于上面第3行,而如果要产生第5行的效果,需要使用const_iterator:

 1 using namespace std;
 2 
 3 vector<int> vec;
 4 const vector<int>::iterator iter = vec.begin();//类似于T* const
 5 *iter = 10; //正确,可以修改iter所指的值
 6 ++iter; //错误,iter是const
 7 
 8 vector<int>::const_iterator cIter = vec.begin();//类似于const T*
 9 *cIter = 10; //错误,cIter指向的值是const
10 ++cIter; //正确

  总结一下:在一般的应用中const会修饰其后的变量和修饰符,而只有在STL的iterator中,const iterator==T* const;const_iterator==const T*。

  记住,尽可能地将不能修改的变量声明为const!

  2.在成员函数中使用const时,如果将成员函数声明为const,则函数中任何对任何成员变量进行修改都会导致错误,这样可以防止我们对对象无意的修改

 1 class TestBlock
 2 {
 3   public:
 4     void ConstFunc() const;//const函数
 5   private:
 6     char* text;
 7     int size;
 8     bool isValid;
 9 }
10 
11 void TestBlock::ConstFunc() const
12 {
13   if(!isValid)
14   {
15     size = strlen(text);//错误
16     isValid = true;//错误
17   }
18 }

  可以通过将成员变量声明为mutable(可变的)来消除这种错误

1 mutable int size;
2 mutable bool isValid;
3

  3.const可用于重载,如果两个函数参数完全一致,可以通过将返回值声明为const或将函数声明为const来进行重载,不过在实现的时候,可以用非const函数来调用const函数,从而减少代码重复。这一块感觉用不太多,暂时就不管了。

  系列文章:

  《Effective C++》读书笔记01:视c++为一个语言联邦

  《Effective C++》读书笔记02:用const,enum,inline减少#define出场机会

  《Effective C++》读书笔记03:多才多艺的const

  《Effective C++》读书笔记04:确保对象在使用之前被初始化

  《Effective C++》读书笔记05:c++默默为您编写的函数

  《Effective C++》读书笔记06:如果不要编译器自动生成的函数,就明确拒绝

  《Effective C++》读书笔记07:为多态基类声明virtual析构函数

  《Effective C++》读书笔记08:别让异常逃离析构函数

  《Effective C++》读书笔记09:绝不在构造和析R过程中调用virtual函数

  《Effective C++》读书笔记10:令operator=返回一个引用指向*this

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明