2019年10月18日 星期五

const

A. 變數宣告

1. const char *tVar;
2. char const *tVar;
3. char * const tVar;
4. const char * const tVar;

加上括號方便了解

1. const (char) *tVar;-->把*tVar當作一個變數,所以*tVar的值,不可變
2. (char) const *tVar;-->同上
3. (char *) const tVar;-->tVar型別為(char *),tVar指標不可變, 右邊語法為一樣意思:const (char *) tVar;
4. const (char *) const tVar;-->指標與和指標所指到值,都不可變


B. Function內有const變數

1. void function(const int Var);
2. void function(const char *Var);
3. void function(char * const Var);

加上括號方便了解,其實就與需告變數同

1. void function(const (char) tVar);-->tVar傳function內,變數值不可變(無意義,tVar本身就傳進去參數)
2. void function(const (char) *tVar);-->*tVar型別為(char),*tVar的值不可變
3. void function((char *) const tVar);-->tVar型別為(char *),tVar指標不可變(無意義, tVar也是傳進去參數)


C. const 放在Function的回傳值

1. const int function()
2. const int *function()
3. int * const function()

加上括號方便了解,其實就與需告變數同

1. const (int) function()-->因回傳值是被assign的,所以沒意義
2. const (int) *function()-->把function()當成變數,應該較很清楚,*function()的值不可變。使用方式:const int *tValue = function();
3. (int *) const function()-->function()型別為(int *),回傳指標不可變。使用方式:int * const tValue = function();


D. const 拿來形容 object / object pointer / object reference

const 形容的物件,表示該物件為const物件,所以物件的任何member都不能改。object pointer / object reference 指到的物件也是一樣。
const 形容的物件,該物件的任何非const成員函數都不能被呼叫用,因為任何非const成員函數都可能有修改成員變數的企圖。

例:
class A
{
    void func1();
    void func2() const;
}

const AAA aObj;

aObj.func1();-->錯誤
aObj.func2();-->正確


const AAA* aObj = new AAA();

aObj->func1();-->錯誤
aObj->func2();-->正確


E. const 形容 class內的變數

class中有const的成員的值固定,不能被修改,且只能在初始化時,給值。
class A
{
    const int mVal;

    A(int mVal): nValue(mVal) {}; //初始化,給值
}


F. const 形容 class內的Function

class中有const的函數,不能修改class中任何非const成員函數。一般把const寫在函數最後。

class A
{
    void function() const; //const函式, 不改變物件的成員變數. 也不能呼叫任何非const成員函數。
}


G. const與define區別

1. compiler行為不同
define-->在compile前,即作取代動作
const-->compile時,處理

2. 類別和檢查行為不同
define-->沒有型別,不做型別檢查,只是展開。
const-->型別型別資訊,在compile時,會檢查。

3. 存儲方式不同
define-->僅展開,不會分配記憶體。
const-->會在記憶體中分配

參考網址:
const 放置位置的意義

沒有留言:

張貼留言