1. 程式人生 > >C++ const修飾函式、函式引數、函式返回值

C++ const修飾函式、函式引數、函式返回值

const修飾函式

在類中將成員函式修飾為const表明在該函式體內,不能修改物件的資料成員而且不能呼叫非const函式。為什麼不能呼叫非const函式?因為非const函式可能修改資料成員,const成員函式是不能修改資料成員的,所以在const成員函式內只能呼叫const函式。
  1. #include <iostream>
  2. usingnamespace std;  
  3. class A{  
  4. private:  
  5.     int i;  
  6. public:  
  7.     void set(int n){ //set函式需要設定i的值,所以不能宣告為const
  8.         i = n;  
  9.     }  
  10.     int
     get() const//get函式返回i的值,不需要對i進行修改,則可以用const修飾。防止在函式體內對i進行修改。
  11.         return i;  
  12.     }  
  13. };  

const修飾函式引數

防止傳入的引數代表的內容在函式體內被改變,但僅對指標和引用有意義。因為如果是按值傳遞,傳給引數的僅僅是實參的副本,即使在函式體內改變了形參,實參也不會得到影響。如:
  1. void fun(constint i){  
  2.     i = 10;  
  3. }  
在函式體內是不能改變i的值的,但是沒有任何實際意義。
const修飾的函式引數是指標時,代表在函式體內不能修改該指標所指的內容,起到保護作用,在字串複製的函式中保證不修改源字串的情況下,實現字串的複製。
  1. void
     fun(constchar * src, char * des){  //保護源字串不被修改,若修改src則編譯出錯。
  2.     strcpy(des,src);  
  3. }  
  4. void main(){  
  5.     char a[10]="china";  
  6.     char b[20];  
  7.     fun(a,b);  
  8.     cout<<b<<endl;  
  9. }  
而且const指標可以接收非const和const指標,而非const指標只能接收非const指標。
const修飾引用時:如果函式引數為使用者自定義的類物件如:
  1. void h(A a){  
  2. …………  
  3. …………  
  4. }  
傳遞進來的引數a是實參物件的副本,要呼叫建構函式來構造這個副本,而且函式結束後要呼叫解構函式來釋放這個副本,在空間和時間上都造成了浪費,所以函式引數為類物件的情況,推薦用引用。但按引用傳遞,造成了安全隱患,通過函式引數的引用可以修改實參的內部資料成員,所以用const來保護實參。
  1. void
     h(const A & a){  
  2. …………  
  3. …………  
  4. }  

const修飾函式返回值

也是用const來修飾返回的指標或引用,保護指標指向的內容或引用的內容不被修改,也常用於運算子過載。歸根究底就是使得函式呼叫表示式不能作為左值。
  1. #include <iostream>  
  2. usingnamespace std;    
  3. class A {  
  4. private:  
  5.     int i;  
  6. public:  
  7.     A(){i=0;}  
  8.     int & get(){  
  9.         return i;  
  10.     }  
  11. };  
  12. void main(){  
  13.     A a;  
  14.     cout<<a.get()<<endl; //資料成員值為0
  15.     a.get()=1; //嘗試修改a物件的資料成員為1,而且是用函式呼叫表示式作為左值。
  16.     cout<<a.get()<<endl; //資料成員真的被改為1了,返回指標的情況也可以修改成員i的值,所以為了安全起見最好在返回值加上const,使得函式呼叫表示式不能作為左值
  17. }