当前位置:天才代写 > tutorial > C语言/C++ 教程 > 《Effective C++》念书条记03:多才多艺的const

《Effective C++》念书条记03:多才多艺的const

2017-11-04 08:00 星期六 所属: C语言/C++ 教程 浏览:306

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函 数,从而淘汰代码反复。这一块感受用不太多,临时就不管了。

 

    关键字:

天才代写-代写联系方式