天天看點

C與C++:const在*和函數體前後的差別

一、const變量

const在*前常量後指針:看*前面是什麼類型就修飾什麼,如int const x則修飾int變量,如int *const y則修飾int *指針

const在*前(左),修飾指針指向的變量,變量值不可更改,即常量值;

const在*後(右),修飾指針本身,指針不可更改。即常位址

int a = 1;

int b = 2;

  1. const int *p = &a;
  1. int const *p = &a;
  1. int *const p = &a;
  1. const int* const p = &a;
  1. int const* const p = &a;
  1. 示例:

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

  1. const int *p = &a;

p = &b;

*p = 0; //錯誤

  1. int const *p = &a;

p = &b;

*p = 0; //錯誤

  1. int *const p = &a;

p = &b; //錯誤

*p = 0;

  1. const int* const p = &a;

p = &b; //錯誤

*p = 0; //錯誤

  1. 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的作用是確定函數不能修改類的執行個體的狀态,與類型的靜态變量沒有關系,是以不能同時用它們。

  1. const int* A::getCount() //防止傳回值被修改

{ return &count; }

  1. int A::getCount(const int& c) //防止參數被修改

{ return count; }

  1. int A::getCount() const//不能修改成員變量(除非是mutable變量),不能調用非const成員函數

{ return count; }

三、const對象

cosnt對象,即常量對象,隻能通路const函數,不能調用非const函數