【轉】C++中const在函數名前面和函數後面的區別
一、概念
當const在函數名前面的時候修飾的是函數返回值,在函數名後面表示是常成員函數,該函數不能修改對象內的任何成員,只能發生讀操作,不能發生寫操作。
二、原理:
我們都知道在調用成員函數的時候編譯器會將對象自身的地址作為隱藏參數傳遞給函數,在const成員函數中,既不能改變this所指向的對象,也不能改變this所保存的地址,this的類型是一個指向const類型對象的const指針。
具體示例:
一個函數名字後有const,這個函數必定是成員函數,也就是說普通函數後面不能有const修飾,如:int print( ) const {.......} 這個函數必定為成員函數,即在類裏面定義的函數。
在一個類裏定義了一個const成員函數後,則此函數不能修改類中的成員變量,如果定義了一個類的const對象(非const對象可以調用const成員函數和非const成員hanshu ),它只能調用類中的const成員函數,如:
class text{
public:
void print_const(void) const { cout<<"hello"<<endl;} //有const修飾
void print(void) {cout<<"hello"<<endl;} //沒有const修飾
void getk(void) const {k=5; } //錯誤,有const修飾,不能修改k的值,
private:
int k;
};
const text a;
int main()
{
a.print(); //錯誤,const對象只能調用
a.printf_const(); //正確
}
// void print() const {} 和 void print() {} 是重載函數,假如對象為const,則調用void print () const成員函數,如果為非const,則調用void print() ;
class text{
public:
void print(void) const {cout<<"hello_const"<<endl;}
void print(void) {cout<<"hello"<<endl;}
};
const text a;
int main()
{
a.print(); //屏幕輸出 hello_const 假如對象a 定義為 text a,則輸出 hello
return 0;
}
【轉】C++中const在函數名前面和函數後面的區別