?const是不變的意思,在C++程序中,經常用const來限制對一個對象的操作:
?
1.1 const變量
例如:?const?int?n=3;???則這個變量的值不能改變,即不能對變量賦值。
?
1.2??const參數
出現在函數參數中的const表示在函數體中不能對這個參數做修改。比如strcmp()函數用來比較兩個字符串的大小,在函數體中不應該改變兩個的參數的值,所以將它定義為是const的。const通常用來限制函數的指針參數、引用和數組參數,而一般形式的參數因為形式參數和實參本來就不在同一個內存空間,所以對形式參數的修改不影響實在參數,因此也沒有必要限制函數不能對參數進行修改。
下面是一些使用函數const參數的例子:
(1)函數strcpy()將src字符串的內容復制到targ字符串中,為保證src字符串不被修改,將它定義問const參數:
void?strcpy(const?char*?src,char?*?targ);
?(2)函數max()?從數組array中找出具有最大值的數組元素并返回這個最大元素的值,為保證數組元素不會再函數中被修改,將它定義為const參數:
int?max(const?int?array[]?,int?size);
??? ?(3)函數outputOjbect()將類MyClass的對象obj的內容輸出。對象定義為const引用,即可以保證對象不會在函數體中所改變,又可以節省對象傳遞的開銷,如:
void?outputObject(const?MyClass?&?obj);
?
1.3 const?返回值
函數返回值為const只有用在函數返回為引用的情況。函數返回值引用常量表示不能將函數調用表達式作為左值使用。
例如:
int?&min(int?&i,int?&j); 可以對函數調用進行賦值,因為它返回的是左值: min(a,b)=4;
但是,如果對函數的返回值限定為const的:
const?int?&min(int?&i?,?int?&j); 那么,就不能對min(a,b)調用進行賦值了。
?
1.4 const?函數
在學到類時,將會看到可以為類的成員函數進行如下形式的定義:
calss?classname{
public?:
int?getMember()?const;
private?:
int?member;
};
這里,在函數定義頭后面加上的const表示這個函數是一個“只讀函數”,函數不能改變類對象的狀態,不能改變對象的成員變量的值。如在函數體中不能這么寫:
classname::getMember()
{
member=4; //錯誤!不能修改成員變量的值
return?member;
}
?
1.5 用const?來限制指針
1).指向常量的指針:
當const出現在指針定義的最開始時,表示定義了一個指向常量的指針。比如:
??int?i;????const?int?ci=20;
?const?int?*?ip1=&ci;????const?int?*?ip2=&i;
??這里定義了兩個指向常量的指針,ip1和ip2。并且ip1初始化為指向一個常量ci,ip2初始化為指向一個變量i。
??????? 指向常量的指針的含義是:不能用過指針來間接修改指針所指向內存空間的值。比如上面的例子就不能通過*ip1來修改常量ci的值,也不能通過*ip2來修改變量i的值,所以下面的語句不正確:
?????? ?*ip1=34; //錯誤!?ip1是指向常量的指針
????? ??*ip2=54;????????//錯誤!?ip12是指向常量的指針
在使用指向常量的指針時,應該注意以下幾點:
a).指向常量的指針只限制指針的間接訪問操作,而不會限制指針變量本身的操作。所以,可以改變指針本身的值。比如可以修改ip1和ip2的值:ip1=&i;??ip2=&ci;
b).指向常量的指針只限制指針的間接訪問的操作,但不會限制所指向的空間的操作。比如指針ip指向一個變量i:
??????? ?int?i;???const?int?*??ip=&i;
???????? *ip=34;????//錯誤!?ip是指向常量的指針
?????? i=56;??????//正確,i是一個變量
? ??c).如果要給一個指針賦一個常量的地址,則這個地址必須定義成指向常量的指針。這樣可以保證不會通過指針來間接修改常量的值。比如:
?????????? const?int?ci=30; //正確!
?????????? const?int*?ip1=&ci; //錯誤!?必須將ip2定義成指向常量的指針
?????? ci是一個常量,如果要將它的地址賦值給一個指針,這個指針必須是一個指向常量的指針。所以不能將一個不指向常量的指針ip2指向常量ci.
?
2). 指針常量
在定義指針的時候,可以通過在指針名的前面加上const來將指針定義成常量,稱為指針常量。和一般的常量一樣,我們不能修改指針常量的值。即我們只能在定義指針時將它初始化為指向某個地方,不能再對指針賦值。下面是對指針常量的定義:
int?i,j;
int?*?const?ip=&i; //正確!定義指針常量ip,初始化為指向變量i
ip=&j; //錯誤!不能改變指向常量的值
注意,對指針變量的const限制并不影響對它所指向空間的操作。可以通過間接引用來操作符‘*’來修改指針所指向的空間值。例如上面定義的指針常量ip指向變量i,可以通過*ip來改變i?的值:?*ip=32; //正確!
3).?指向常量的指針常量
如果將上面兩個結合起啦,就可以定義指向常量的指針常量。下面定義了這么一個指針:
const?int?ci=93;
const?int?*?const?pi=&ci;
指向常量的指針常量必須在定義時初始化,它的使用也非常受限制,我們不能改變指針本身的值,也不能通過指針來間接改變指針,只能在程序中使用它們的值。
?
上面介紹了利用const來限定指針的三種情況。需要記住的是,指針本身和指針所指向的空間是兩個不同的內存空間,所以需要對兩者分別限定。
?
?
?