程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 《Effective C++》讀書筆記03:多才多藝的const

《Effective C++》讀書筆記03:多才多藝的const

編輯:關於C++

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函 數,從而減少代碼重復。這一塊感覺用不太多,暫時就不管了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved