1. 程式人生 > >C++學習筆記/const和指針

C++學習筆記/const和指針

con 存儲 限定 ons 假設 雙精度 可能 精度 num

2.4 const 限定符

  const int k; //錯誤 K是一個未經初始化的常量

2.4.1 const的引用

  把引用綁定到const 對象上,我們稱之為對常量的引用,與普通引用不同的是,對常量的引用不能被工作修改它所綁定的對象。

  const int ci = 1024;

  const int &r1 = ci;

  r1 = 42;

  int &r2 = ci;//錯誤,試圖讓一個非常量引用指向一個常量對象

  因為不允許直接為ci 復制,當然也就不能通過引用去改變ci。 因此,對r2的初初始化時錯誤的,假設該初始化合法,則可以通過r2來改變它引用對象的值,這顯然是不正確的。

初始化和const的引用

  引用的類型必須與引用對象的類型完全一致,但有兩個例外:

    a. 初始化常量引用時允許用任意表達式作為初始值,只要該表達式的結果能轉換成引用的類型即可,尤其,允許為一個常量引用綁定非常量的對象,字面值,甚至是個一般表達式。

對const的引用可能引用一個並非const的值

  常量引用僅僅對可參與的 操作做出了限定,對於引用的對象本身是不是一個常量未做限定,因為對象也可能是個非常量,所以允許通過其他途徑改變它的值:

  int i = 42;

  int &r1 = i;//引用ri 綁定對象i

  const int &r2 =i; //r2也綁定對象i;但是不允許通過r2修改i的值

  r1 = 0; //r1並非常量,i的值修改為0

  r2 = 0; //錯誤,r2是一個常量引用

r2綁定非常量整數i是合法的行為,但是不允許通過r2修改i的值,但是i的值可以通過其它途徑修改,既可以直接給i賦值,也可以通過向r1一樣綁定到i的其它引用來修改。

2.4.2 指針和const

  指向常量的指針不能用於改變其所指對象的值,要想存放常量對象的地址,只能使用只想常量的指針:

    const double pi = 3.14; //pi是個常量,它的值不能改變

    double *ptr = π //錯誤,ptr是一個普通指針

    const double *cptr = π

// 正確,cptr可以指向一個雙精度常量

    *cptr =42; //錯誤,不能給cptr賦值

    

    double dval = 3.14 ;//dval 是一個雙精度浮點數,它 的值可以改變

    cptr = & dval;//正確,但是不能通過cptr改變dval的值.

const指針

  指針是對象而引用不是,常量指針必須初始化,而且一旦初始化完成,則它的值(也就是存放在指針中的那個值就不能再改變了)

  把*放在const關鍵字之前,用以說明指針是一個常量,這樣的書寫形式隱含著一層意味,不便的是指針本身的值而不是指向的那個值。

      int errNum = 0;

      int *const curErr = &errNumb; //curErr 將一直指向errNum;

      const double pi = 3.14159;

      const double *const pip = π //pip是一個指向常量對象的常量指針

//指針本身是一個常量並不意味著不能通過指針修改其所指對象的值,能否這樣做完全依賴於所指對象的類型,如pip 是一個指向常量的常量指針,則不論是pip還是pip自己存儲的那個地址都不能改變。,相反,curErr指向的是一個一般非常量整數那麽完全可以用curErr去修改errNumb的值:

    *pip = 712; //錯誤,pip是一個指向常量的指針

    if(*curErr){

      *curErr = 0;//正確,把curErr 所指的對象的值重置。

    }

C++學習筆記/const和指針