一、const變量
const在*前常量後指針:看*前面是什麼類型就修飾什麼,如int const x則修飾int變量,如int *const y則修飾int *指針
const在*前(左),修飾指針指向的變量,變量值不可更改,即常量值;
const在*後(右),修飾指針本身,指針不可更改。即常位址
int a = 1;
int b = 2;
- const int *p = &a;
- int const *p = &a;
- int *const p = &a;
- const int* const p = &a;
- int const* const p = &a;
- 示例:
int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
const int srcStride[], int srcSliceY, int srcSliceH,
uint8_t *const dst[], const int dstStride[]);
const uint8_t *const srcSlice[] == uint8_t const *const srcSlice[] == const uint8_t *const *srcSlice
如有變量:uint8_t *data[AV_NUM_DATA_POINTERS];
傳參轉換:(const uint8_t *const *)data //或 (uint8_t const *const *)data
- const int *p = &a;
p = &b;
*p = 0; //錯誤
- int const *p = &a;
p = &b;
*p = 0; //錯誤
- int *const p = &a;
p = &b; //錯誤
*p = 0;
- const int* const p = &a;
p = &b; //錯誤
*p = 0; //錯誤
- int const* const p = &a;
p = &b; //錯誤
*p = 0; //錯誤
二、const函數:const傳回值,參數,函數體
隻讀函數:在函數後加const,隻有類的非靜态成員函數後可以加const修飾,表示該類的this指針為const類型,不能改變類的成員變量的值,任何改變成員變量的行為均為非法。
說明:類中const(函數後面加)與static不能同時修飾成員函數,原因有以下兩點
C++函數前後加const的差別_函數前加const_Gorgeous_mj的部落格-CSDN部落格
①C++編譯器在實作const的成員函數時,為了確定該函數不能修改類的執行個體狀态,會在函數中添加一個隐式的參數const this*。但當一個成員為static的時候,該函數是沒有this指針的,也就是說此時const的用法和static是沖突的;
②兩者的語意是沖突的。static的作用是表示該函數隻作用在類型的靜态變量上,與類的執行個體沒有關系;而const的作用是確定函數不能修改類的執行個體的狀态,與類型的靜态變量沒有關系,是以不能同時用它們。
- const int* A::getCount() //防止傳回值被修改
{ return &count; }
- int A::getCount(const int& c) //防止參數被修改
{ return count; }
- int A::getCount() const//不能修改成員變量(除非是mutable變量),不能調用非const成員函數
{ return count; }
三、const對象
cosnt對象,即常量對象,隻能通路const函數,不能調用非const函數