const修飾符與函數


一、用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;
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM