string const&和const string&有什么区别吗?
例如
#include <iostream> using namespace std; int main() { string b = "test"; const string &a = b; string const &c = b; return 0; }
人生最曼妙的风景,竟是内心的淡定与从容!
並沒有差別。
我們先從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引用型別
int a
int *a
类型名+变量名
int*a
变量名
类型名
int*
int &a
扯回正題,string const &a聲明了一個(&a),(&a)是string類型且為常數而const string &a聲明了一個(&a),(&a)是常數且為string類型這顯然是同一個意思啊~
string const &a
const string &a
稍微扯遠一點,來看用來坑小朋友的辨析題,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)可以被修改
const char *a
char * const a
char const *a和const char *a是同一個意思,而如果既不允許a被修改,也不允許a所指向的數據被修改,那麼需要聲明為const char * const a
char const *a
const char * const a
沒有差別。
並沒有差別。
我們先從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
沒有差別。