const是我們寫c++代碼時的???,對于那些我們不希望修改的對象,用const進行修飾。
1.下面來看看一些慣用法:
1 char greeting[] = "Hello";
2 char* p = greeting; //非const指針,非const數(shù)據(jù)
3 const char* p = greeting; //非const指針,const數(shù)據(jù)
4 char const *p = greeting; //非const指針,const數(shù)據(jù)
5 char* const p = greeting; //const指針,非const數(shù)據(jù)
6 const char* const p = greeting; //const指針,const數(shù)據(jù)
3和4行雖然形式不同,不過功能是類似的。
3和5有本質(zhì)的不同,可以這么理解:const會修飾在它后面所有的代碼,比如第3,4中的const修飾char* p,表示char*,而在第5中const修飾p,表示指針。
可這些在STL中有所不同,由于iterator是一個指針,用const修飾一個iterator會類似于上面第3行加入收藏,而如果要產(chǎn)生第5行的效果,需要使用const_iterator:
1 using namespace std;
2
3 vector vec;
4 const vector::iterator iter = vec.begin();//類似于T* const
5 *iter = 10; //正確,可以修改iter所指的值
6 ++iter; //錯誤,iter是const
7
8 vector::const_iterator cIter = vec.begin();//類似于const T*
9 *cIter = 10; //錯誤,cIter指向的值是const
10 ++cIter; //正確
總結(jié)一下:在一般的應(yīng)用中const會修飾其后的變量和修飾符,而只有在STL的iterator中,const iterator==T* const;const_iterator==const T*。
記住,盡可能地將不能修改的變量聲明為const!
2.在成員函數(shù)中使用const時,如果將成員函數(shù)聲明為const,則函數(shù)中任何對任何成員變量進行修改都會導(dǎo)致錯誤,這樣可以防止我們對對象無意的修改
1 class TestBlock
2 {
3 public:
4 void ConstFunc() const;//const函數(shù)
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可用于重載,如果兩個函數(shù)參數(shù)完全一致,可以通過將返回值聲明為const或?qū)⒑瘮?shù)聲明為const來進行重載,不過在實現(xiàn)的時候,可以用非const函數(shù)來調(diào)用const函數(shù),從而減少代碼重復(fù)。這一塊感覺用不太多,暫時就不管了。
1.下面來看看一些慣用法:
1 char greeting[] = "Hello";
2 char* p = greeting; //非const指針,非const數(shù)據(jù)
3 const char* p = greeting; //非const指針,const數(shù)據(jù)
4 char const *p = greeting; //非const指針,const數(shù)據(jù)
5 char* const p = greeting; //const指針,非const數(shù)據(jù)
6 const char* const p = greeting; //const指針,const數(shù)據(jù)
3和4行雖然形式不同,不過功能是類似的。
3和5有本質(zhì)的不同,可以這么理解:const會修飾在它后面所有的代碼,比如第3,4中的const修飾char* p,表示char*,而在第5中const修飾p,表示指針。
可這些在STL中有所不同,由于iterator是一個指針,用const修飾一個iterator會類似于上面第3行加入收藏,而如果要產(chǎn)生第5行的效果,需要使用const_iterator:
1 using namespace std;
2
3 vector
4 const vector
5 *iter = 10; //正確,可以修改iter所指的值
6 ++iter; //錯誤,iter是const
7
8 vector
9 *cIter = 10; //錯誤,cIter指向的值是const
10 ++cIter; //正確
總結(jié)一下:在一般的應(yīng)用中const會修飾其后的變量和修飾符,而只有在STL的iterator中,const iterator==T* const;const_iterator==const T*。
記住,盡可能地將不能修改的變量聲明為const!
2.在成員函數(shù)中使用const時,如果將成員函數(shù)聲明為const,則函數(shù)中任何對任何成員變量進行修改都會導(dǎo)致錯誤,這樣可以防止我們對對象無意的修改
1 class TestBlock
2 {
3 public:
4 void ConstFunc() const;//const函數(shù)
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可用于重載,如果兩個函數(shù)參數(shù)完全一致,可以通過將返回值聲明為const或?qū)⒑瘮?shù)聲明為const來進行重載,不過在實現(xiàn)的時候,可以用非const函數(shù)來調(diào)用const函數(shù),從而減少代碼重復(fù)。這一塊感覺用不太多,暫時就不管了。