c++ - string const&和const string&有什么区别吗?

查看:653
本文介绍了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;
}

解决方案

并没有区别。

我们先从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

这篇关于c++ - string const&amp;和const string&amp;有什么区别吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆