搜尋

首頁  >  問答  >  主體

c++ - string const&和const string&有什么区别吗?

string const&和const string&有什么区别吗?

例如

#include <iostream>
using namespace std;

int main()
{
    string b = "test";
    const string &a = b;
    string const &c = b;
    return 0;
}
黄舟黄舟2805 天前1606

全部回覆(2)我來回復

  • 怪我咯

    怪我咯2017-04-17 14:01:00

    並沒有差別。

    我們先從C/C++的變數宣告方式說起。
    最簡單的陳述方式如int a,表明聲明了一個變數a,並使得a是int類型
    那麼按照上文的說法,聲明int *a表明宣告了一個變數*a,並使得*a是int型別
    我們已經知道(*a)是int型別了,而星號是解引用運算符,(*a)表示變數a所指向的記憶體位址的資料。從這一層意義上,我們推論出了a的型別為int的指標型別。
    a的型別為int指針,那我們要怎麼表示呢?考慮到C常見的陳述方式是类型名+变量名,在聲明int*a中,既然a是变量名,所以int*就是类型名咯,於是我們就用int*來表示int指標型
    同理,int &a可以認為是宣告了一個int型別的變數(&a),透過&運算子意義得知a是int引用型別,並用int&來表示int引用型別

    扯回正題,string const &a聲明了一個(&a),(&a)是string類型且為常數
    const string &a聲明了一個(&a),(&a)是常數且為string類型
    這顯然是同一個意思啊~

    稍微扯遠一點,來看用來坑小朋友的辨析題,const char *achar * const a
    前者聲明(*a),(*a)是const char類型的。 a被解引用運算子修飾,故a是個普通的指針,可以修改,但是a所指向的資料(即*a)由於const的修飾而不可修改
    後者宣告(*const a),( *const a)是char型的。 a被一個解引用運算子和一個const關鍵字修飾,故a是個不可修改的指針,但是a所指向的資料(即*a)可以被修改

    char const *aconst char *a是同一個意思,而如果既不允許a被修改,也不允許a所指向的數據被修改,那麼需要聲明為const char * const a

    回覆
    0
  • PHPz

    PHPz2017-04-17 14:01:00

    沒有差別。

    回覆
    0
  • 取消回覆