string const&和const string&有什么区别吗?
例如
#include <iostream>
using namespace std;
int main()
{
string b = "test";
const string &a = b;
string const &c = b;
return 0;
}
怪我咯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 *a
和char * const a
前者聲明(*a),(*a)是const char類型的。 a被解引用運算子修飾,故a是個普通的指針,可以修改,但是a所指向的資料(即*a)由於const的修飾而不可修改
後者宣告(*const a),( *const a)是char型的。 a被一個解引用運算子和一個const關鍵字修飾,故a是個不可修改的指針,但是a所指向的資料(即*a)可以被修改
char const *a
和const char *a
是同一個意思,而如果既不允許a被修改,也不允許a所指向的數據被修改,那麼需要聲明為const char * const a