首页  >  问答  >  正文

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;
}
黄舟黄舟2713 天前1520

全部回复(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
  • 取消回复