常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的。因此,定義或說明常型別時必須進行初始化。
概述1. const有什麼用途?
在 c程式中,const的用法主要有
定義常量、修飾函式引數、修飾函式返回值
等3個用處。
在c++程式中,它還可以
修飾函式的定義體,定義類中某個成員為常態函式,即不改變類中的資料成員。
被const修改的東西都要受到強制保護,可以預防意外的變動,能提高程式的健壯性。
2. const與#define相比有什麼不同?
(1) const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換中可能會產生意料不到的錯誤(邊際效應)。
(2) 在c++中使用const常量而不使用巨集常量,即const常量完全取代巨集常量。
c++中的const
一,一般常量和物件常量
1. 一般常量
一般常量是指簡單型別的常量。這種常量在定義時,修飾符const可以用在型別說明符前,也可以用在型別說明符後。如:
int const x=2;
或const int x=2;
定義或說明乙個常陣列可採用如下格式:
《型別說明符》 const 《陣列名》[《大小》]…
或者const 《型別說明符》 《陣列名》[《大小》]…
例如:int const a[5]=;
2. 常物件
常物件是指物件常量,定義格式如下:
《類名》 const 《物件名》
或者const 《類名》 《物件名》
定義常物件時,同樣要進行初始化,並且該物件不能再被更新,修飾符const可以放在類名後面,也可以放在類名前面。
二,常指標和常引用
1. 常指標
使用const修飾指標時,由於const的位置不同,而含意不同。如果const位於星號的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量。(如果const在*的左邊,則被指物為常量;在右邊,則指標為常量)下面舉兩個例子,說明它們的區別。
下面定義的乙個指向字串的常量指標:
char * const prt1 = stringprt1;
其中,ptr1是乙個常量指標。因此,下面賦值是非法的。
ptr1 = stringprt2;
而下面的賦值是合法的:
*ptr1 = "m";
因為指標ptr1所指向的變數是可以更新的,不可更新的是常量指標ptr1所指的方向(別的字串)。
下面定義了乙個指向字串常量的指標:
const * ptr2 = stringprt1;
其中,ptr2是乙個指向字串常量的指標。ptr2所指向的字串不能更新的,而ptr2是可以更新的。因此,
*ptr2 = "x";
是非法的,而:
ptr2 = stringptr2;
是合法的。
所以,在使用const修飾指標時,應該注意const的位置。定義乙個指向字串的指標常量和定義乙個指向字串常量的指標時,const修飾符的位置不同,前者const放在*和指標名之間,後者const放在型別說明符前。
2. 常引用
使用const修飾符也可以說明引用,被說明的引用為常引用,該引用所引用的物件不能被更新。其定義格式如下:
const 《型別說明符》 & 《引用名》
例如:const double & v;
在實際應用中,常指標和常引用往往用來作函式的形參,這樣的引數稱為常引數。
在c++物件導向的程式設計中,指標和引用使用得較多,其中使用const修飾的常指標和常引用用得更多。使用常引數則表明該函式不會更新某個引數所指向或所引用的物件,這樣,在引數傳遞過程中就不需要執行拷貝初始化建構函式,這將會改善程式的執行效率。
下面舉一例子說明常指標作函式引數的作法。
[cpp]view plain
copy
print?
#include
using
namespace std;
const
int n = 6;
void print(const
int *p, int n);
void main()
void print(const
int *p, int n) //表示p指向的內容不可修改,p本身可以修改
"<}
三,常成員函式
使用const關鍵字進行說明的成員函式,稱為常成員函式。
只有常成員函式才有資格操作常物件,沒有使用const關鍵字說明的成員函式不能用來操作常物件。
常成員函式說明格式如下:
《型別說明符》 《函式名》 (《參數列》) const;
本質:
成員函式的第乙個引數是const this指標,const修飾的成員函式的第乙個引數是const t *this。
其中,const是加在函式說明後面的型別修飾符,它是函式型別的乙個組成部分,因此,在函式實現部分也要帶const關鍵字。下面舉一例子說明常成員函式的特徵。
[cpp]view plain
copy
print?
#include
using
namespace std;
class r
void print();
void print() const;
private:
int r1, r2;
};
void r::print()
void r::print() const
void main()
該例子的輸出結果為:
5,4 20;52
該程式的類宣告了兩個成員函式,其型別是不同的(其實就是過載成員函式)。
有帶const修飾符的成員函式處理const常量,這也體現出函式過載的特點。
四,常資料成員
型別修飾符const不僅可以說明成員函式,也可以說明資料成員。
由於const型別物件必須被初始化,並且不能更新,因此,在類中說明了const資料成員時,只能通過成員初始化列表的方式來生成建構函式對資料成員初始化。
下面通過乙個例子講述使用成員初始化列表來生成建構函式。
[cpp]view plain
copy
print?
#include
using
namespace std;
class t
; //const int t::b=20; //也可以在類外,但是只能初始化一次
[cpp]view plain
copy
print?
t::t(int i):a(i),r(a) //必須在初始化列表中給常量初始化,但是不能初始化靜態常量
void t::print()
void main()
該程式的執行結果為:
100:10:100
0:10:0
在該程式中,說明了如下三個常型別資料成員:
const int & r;
const int a;
static const int b;
其中,r是常int型引用,a是常int型變數,b是靜態常int型變數。
程式中對靜態資料成員b進行初始化。
值得注意的是建構函式的格式如下所示:
a(int i):a(i),r(a)
其中,冒號後邊是乙個資料成員初始化列表,它包含兩個初始化項,用逗號進行了分隔,因為資料成員a和r都是常型別的,需要採用初始化格式
**:
const 用法小結
const用法小結 關於c 中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性。1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在...
const用法小結
關於c 中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性,參考了康建東兄的const使用詳解一文,對其中進行了一些補充,寫下了本文。1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全...
Const用法小結
關於c 中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性,參考了康建東兄的const使用詳解一文,對其中進行了一些補充,寫下了本文。1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全...