Heim > Fragen und Antworten > Hauptteil
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