84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
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
没有区别。