C++中const的妙用
const的基本概念:
const名叫常量限定符,用來限定特定變數,以通知編譯器該變數是不可修改的。習慣性的使用const,可以避免在函式中對某些不應修改的變數造成可能的改動。
下面我就const的用法來談談:
const的用法大致可分為以下幾個方面:
(1)const修飾基本資料型別
(2)const應用到函式中
(3)const在類中的用法
(4)const修飾類物件,定義常量物件
一、const修飾基本資料型別
1.const修飾一般常量及陣列
const int a=10; 等價的書寫方式: int const a=10;
const int arr[3]={1,2,3}; int const arr[3]={1,2,3};
對於類似這些基本資料型別,修飾符const可以用在型別說明符前,也可以用在型別說明符後,其結果是一樣的。在使用這些常量的時候,只要不改變這些常量的值便好。
2.const修飾指標變數*及引用變數&
介紹本部分內容之前,先說說指標和引用的一些基本知識。
指標(pointer)是用來指向實際記憶體地址的變數,一般來說,指標是整型,而且一般的大家會接受十六進位制的輸出格式。
引用(reference)是其相應變數的別名,用於向函式提供直接訪問引數(而不是引數的副本)的途徑,與指標相比,引用是一種受限制的指標型別,或者說是指標的一個子集,而從其功能上來看,似乎可以說引用是指標功能的一種高層實現。
關於運算子&和*:
在C++裡,沿襲C中的語法,有兩個一元運算子用於指標操作:&和*。按照本來的定義,&應當是取址符,*是指標符,也就是說,
&用於返回變數的實際地址,*用於返回地址所指向的變數,他們應當互為逆運算。實際的情況也是如此。
在定義變數的引用的時候,&只是個定義引用的標誌,不代表取地址。
舉例:
1 #include<iostream.h>
2 void main()
3 {
4 int a; //a is an integer
5 int *aPtr; //aPtr is a pointer to an integer
6
7 a=7;
8 aPtr = &a;
9 cout<<"Showing that * and & are inverses of "<<"each other.\n";
10 cout<<"a="<<a<<" *aPtr="<<*aPtr<<"\n";
11 cout<<"&*aPtr = "<<&*aPtr<<endl;
12 cout<<"*&aPtr = "<<*&aPtr <<endl;
13 }
執行結果:
瞭解完指標和應用的基本概念之後,下面繼續我們的話題。
const修飾指標(*):
const int* a = & [1] //非常量資料的常量指標 指標常量 int const a = &
[2] //非常量資料的常量指標 a is a pointer to the constant char
variable int const a = & [3] //常量資料的非常量指標指標常量 常量指標 a is a
constant pointer to the (non-constant) char variable const int* const
a = & [4] //常量資料的常量指標可以參考《Effective c++》Item21上的做法,
如果const位於星號*的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;
如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量。
因此,[1]和[2]的情況相同,都是指標所指向的內容為常量,這種情況下不允許對內容進行更改操作,如不能*a = 3 ;
[3]為指標本身是常量,而指標所指向的內容不是常量,這種情況下不能對指標本身進行更改操作,如a++是錯誤的;
[4]為指標本身和指向的內容均為常量。
const修飾引用(&):
int const &a=x;
const int &a=x;
int &const a=x;//這種方式定義是C、C++編譯器未定義,雖然不會報錯,但是該句效果和int &a一樣。
這兩種定義方式是等價的,此時的引用a不能被更新。如:a++ 這是錯誤的。
二、const應用到函式中
-
作為引數的const修飾符
-
作為函式返回值的const修飾符 其實,不論是引數還是返回值,道理都是一樣的,引數傳入時候和函式返回的時候,初始化const變數 1 修飾引數的const,如
void fun0(const A* a );
void fun1(const A& a); -
呼叫函式的時候,用相應的變數初始化const常量,則在函式體中,按照const所修飾的部分進行常量化,如形參為const Aa,則不能對傳遞進來的指標的內容 進行改變,保護了原指標所指向的內容;如形參為const A& a,則不能對傳遞進來的引用物件進行改變, 保護了原物件的屬性。
[注意]:引數const通常用於引數為指標或引用的情況; 2 修飾返回值的const,如
const A fun2( );
const A fun3( );
這樣宣告瞭返回值後,const按照"修飾原則"進行修飾,起到相應的保護作用。
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
返回值用const修飾可以防止允許這樣的操作發生:
Rational a,b;
Radional c;
(a*b) = c;
一般用const修飾返回值為物件本身(非引用和指標)的情況多用於二目操作符過載函式併產生新物件的時候。
類中的成員函式:A fun4()const; 其意義上是不能修改所在類的的任何變數。
三、類中定義常量(const的特殊用法)
在類中實現常量的定義大致有這麼幾種方式實現:
1.使用列舉型別
class test
{
enum { SIZE1 = 10, SIZE2 = 20}; // 列舉常量
int array1[SIZE1];
int array2[SIZE2];
};
2.使用const 或static
C++11僅不允許在類宣告中初始化static非const型別的資料成員。
// using c++11 standard
class CTest11
{
public:
static const int a = 3; // Ok in C++11
static int b = 4; // Error
const int c = 5; // Ok in C++11
int d = 6; // Ok in C++11
public:
CTest11() :c(0) { } // Ok in C++11
};
int main()
{
CTest11 testObj;
cout << testObj.a << testObj.b << testObj.c << testObj.d << endl;
return 0;
}
到這裡就把在類中定義常量的方法都陳列出來了。
關於C++11新特性: C++11僅不允許在類宣告中初始化static非const型別的資料成員
總結如下:
-
對於static const 型別的成員變數不管是舊的C++標準還是C++11都是支援在定義時初始化的。
-
對於static非const型別的成員變數C++03和C++11的標準都是不支援在定義時初始化的。
-
對於const非static型別的成員變數C++03要求必須在建構函式的初始化列表中來初始化,而C++11的標準支援這種寫法,同時允許在定義時進行初始化操作。
-
對於非static非const成員變數,C++03標準不允許在成員變數定義時初始化,但是C++11標準允許在類的定義時對這些非靜態變數進行初始化。
-
對於static非const成員變數的初始化方式並未改變,就是在相應的cpp檔案中寫成int CTest11::b = 5即可,注意要在類定義之後。
四、const定義常量物件,以及常量物件的用法
class test
{
public:
test():x(1)
{
y=2;
}
~test()
{}
void set(int yy)
{
y=yy;
}
int getx() const
{
return x;
}
protected:
const int x;
int y;
};
void main()
{
const test t;
t.set(33);//error
t.getx();
}
常量物件只能呼叫常量函式,別的成員函式都不能呼叫。
五、使用const的一些建議
-
<1>要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
-
<2>要避免最一般的賦值操作錯誤,如將const變數賦值,具體可見思考題;
-
<3>在引數中使用const應該使用引用或指標,而不是一般的物件例項,原因同上;
-
<4>const在成員函式中的三種用法(引數、返回值、函式)要很好的使用;
-
<5>不要輕易的將函式的返回值型別定為const;
-
<6>除了過載操作符外一般不要將返回值型別定為對某個物件的const引用;
相關文章
- C++中const的用法C++
- C/C++中的constC++
- C++ 中的 const 物件與 const 成員函式C++物件函式
- C++中const的簡單用法C++
- C++中的 const 關鍵字C++
- C++中const小結C++
- C/C++中Static和Const的作用C++
- C++中const用法總結C++
- C++ const int * ; int * constC++
- C++中const與指標、引用的總結C++指標
- C++ const常量的理解C++
- C++ 頂層const底層constC++
- C++中string、char *、char[]、const char*的轉換C++
- C++中的static成員、static const成員和const成員的初始化C++
- SQL中LIKE的妙用SQL
- C++基礎 constC++
- C++ const 總結C++
- C++中函式後面加const修飾C++函式
- js中的Boolean 的妙用JSBoolean
- 關於C/C++ const變數 const指標 以及C++ 引用變數的解析C++變數指標
- C++ constexp vs constC++
- C++中char* const char* string 之間的轉換複習C++
- 關於C++ const 的全面總結C++
- KeyPath在Swift中的妙用Swift
- vue-router中scrollBehavior的妙用Vue
- c++方法後面加constC++
- C/C++ Const 小知識C++
- c/c++ const關鍵字C++
- c++ const 成員函式C++函式
- C++之const限定符C++
- C++ static、const和static const變數 以及它們的初始化C++變數
- c++基礎知識(八)C/C++中修飾符const、extern、static、volatile的用法C++
- const關鍵字在C與C++中修飾變數的區別C++變數
- 位運算子在JS中的妙用JS
- 食物在電子遊戲中的妙用遊戲
- CSS中content屬性的妙用CSS
- Web Worker在專案中的妙用Web
- 滑鼠雙擊在Excel中的妙用Excel