C++ 引用、指針、const

C++ 引用、指針、const


引用

  • 引用就是對象的一個別名,常用作函數的形式參數。通過在變量名前加“&”來定義。不能定義引用類型的引用,什麼是引用類型的引用?
int a = 10;
int& b = a;
int& c = b;
//上面代碼可以編譯通過,且可運行,c的值也爲10
int&& d = c;   //編譯不通過,這是引用類型的引用,就如int** p是指針的指針同理


  1. 引用是別名

因爲引用只是所綁定對象的一個別名,所以對引用所作的操作都會作用到它所綁定的對象上。
  • 引用必須用於該引用同類型的對象初始化
  • int i = 1024;
    int& ref1;   //error:未初始化
    int& ref2 = 100; //error:初始化必須爲一個同類型的對象
    int& ref3 = i;      //ok

    引用與指針區別


    1. 相同點

    指針和引用都是地址的概念,指針指向一塊內存,它的值是這塊內存的地址;引用是某塊內存的別名。

  • 區別
    • 引用是個別名,指針是個實體
      • 指針可以爲空,引用不能爲空
      • 引用使用時不需要解引號(*),而指針需要
      • 引用只能在定義時初始化一次,之後不能改變,指針可以改變指向的對象
      • “sizeof引用”得到的是所綁定對象的大小,而“sizeof指針”得到的是指針本身的大小
      • 引用和指針的自增運算符(++)意義不一樣
        引用與指針不難區別,當引用和指針加上const就懵了,看看它們之間的用法吧。

    const與引用,指針

    const用法

    • const用法主要是防止定義的對象再次被修改,把修飾的對象轉變爲了一個常量,定義const類型的變量時要初始化。
    const int size = 1024; //定義size爲常量並初始化爲1024,變量size仍然是一個左值,但是是一個不可修改的左值
    size = 10;      //error:不可修改const修飾的對象


    • const對象默認爲文件的局部變量

    在全局作用域聲明的const變量是定義在該對象的文件的局部變量,此變量只存在於那個文件中,不能被其它文件訪問。通過制定const變量爲extern,就可在整個程序中訪問const對象。
    //file1.cpp
    extern const int buf = 512;
    //file2.cpp
    extern const int buf;       //file1.cpp中buf必須顯式地加上extern才能編譯通過並使用
    

    const與引用


    • const引用

    const引用是指向const對象的引用
    const int val = 1024;
    int& ref1 = val;    //error:非const引用綁定一個const對象是非法的
    const int& ref2 = val;  //ok
    
    //上面代碼中ref2不能修改了,任何對ref2的賦值操作都是非法的

    const引用可以初始化爲不同類型的對象或者初始化爲右值

    int i = 10;
    const int& ref = 20;
    const int& ref2 = ref+i;
    //編譯通過

    const與指針


    • 指向const對象的指針

    我們可以使用指針來修改所指對象的值,但是如果指針指向的是const對象,我們就不能讓指針來修改所指對象的值,c++強制要求指向const對象的指針必須具有const特性。
    const int* cptr;
    //cptr是一個指向int類型const對象的指針,const限定了cptr指針所指向的對象的類型,而非cptr指針本身。即cptr並不是const。在定義時也就不需要對cptr進行初始化,如果需要,cptr可以改變指向其它 const int型的變量。但不能通過cptr改變所指對象的值
    *cptr = 20;     //error:不能修改cptr所指對象的值

    允許把非const對象的地址賦給指向const對象的指針

    int val = 2;
    const int* ref = &val;  //ok,儘管val不是const對象,但是任何想通過ref修改其值的香味都會編譯錯誤
    //但是val不是const對象,所有有可能被其它方式修改值,只是ref不能修改val的值


    • const指針

    指針本身的值不能修改,即不能改變指針指向其它對象,任何給指針賦值的行爲都會編譯錯誤,const指針也必須在定義時初始化。
  • 指向const對象的const指針
  • const int* const ptr = &a;  //既不能修改所指對象的值,也不允許修改指針指向
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章