一、用const修飾函數的參數##
函數參數類型前加const指明該參數為常量,在函數內部不可改變。
void func(const int x) {
//x不可以在內部進行賦值等操作.
}
注:當參數為引用傳遞或者指針傳遞作為輸出時,都不能加const
二、用const修飾函數的返回值##
函數返回時,會把返回值復制到外部臨時的存儲單元中,存儲類型由函數的返回類型來確定。
- “值傳遞”加const修飾沒有任何價值。
- ”址傳遞”加const修飾,函數返回值只能被賦給加const修飾的同類型指針,或者利用const_case轉化為去const的常量。
const int* func(void) //函數聲明
...
int* a = func(); //報錯
int* c = const_cast<int*>(func()); //正確
const int* b = func() //正確
- "引用返回",引用即為const指針,函數返回引用並加const限定后,函數返回的是地址與地址所存的值都被const修飾的指針,存於臨時的外部存儲單元中,
const int& func(); //函數聲明
...
int b = func(); //正確,從外部存儲單元中賦值給變量
int& c = func(); //錯誤,試圖在同一個地址中即存儲變量又存儲常量
int& d = const_cast<int&>(func()); //正確,去const
const int& e = func(); //正確
如果上面錯誤的例子看不懂可以看之前的const修飾符限定的常量指針const與non-const賦值部分。
引用返回總結
引用返回一般很少用,但既然選擇引用返回,返回的肯定是一個作用域高於函數作用域的變量的引用,畢竟函數作用域下的變量在函數結束后會釋放掉(static這里不考慮)引用即為該變量的const指針,既然選擇返回指針,就想通過直接利用指針修改該地址下的變量,所以就更沒有必要返回const引用,畢竟const引用的返回值不希望對地址所存的值進行修改。引用返回更常用的方式是:
int& func();
...
int& a = func();
這一可以通過a來改變返回值。
三、const 成員函數##
任何不會修改數據成員的函數都應該聲明為const類型。如果在編寫const成員函數時,不慎修改了數據成員,或者調用了其它非const成員函數,編譯器將指出錯誤。
class test
{
public:
void func(){}
int getNum(void) const // const 成員函數
{
++num; // 編譯錯誤,企圖修改數據成員m_num
func(); // 編譯錯誤,企圖調用非const函數
return num;
}
private:
int num;
};
