C++ 左值引用与 const 关键字
左值引用是已定义的变量的别名,其主要用途是用作函数的形参,通过将左值引用变量用作参数,函数将使用原始数据,而不是副本。引用变量必须在声明时同时初始化,可将 const 关键字用于左值引用,如下所示:
//声明并初始化常规左值引用变量
int x = 55;
int & rx = x;
//将const关键字用于左值引用变量,以下几种为等效表示
int x = 55;
const int & crx = x;
int const & crx = x;
在 Microsoft Visual Studio 中连续多个 const 会被编译器解释成一个,即 const const const const int & 与 const int & 等效,除此之外,const int const & 在 Microsoft Visual Studio 中也与 const int & 等效,而 int & const 在 QT 中将会报错,在 Microsoft Visual Studio 中与 int & 等效。
以上两种类型左值引用的特性如下(旧版 C++ 可能与下列特性不十分吻合,以 C++11 为准):
类型为
int &的引用rx只能作为已有变量的别名,不会生成临时变量,可修改所引用变量的值,可将int变量、int &变量、int *指针所指变量、int *const指针所指变量在初始化时赋给rx(接受可通过地址访问的非const变量),必须在声明时初始化,后续无法更换所引用的变量。变量初始化完成后,其表现与int类型一致。类型为
const int &的引用crx既可作为已有变量的别名,也可在合适的时候生成临时变量,成为该临时变量的别名,但不可修改所引用变量的值,可将int变量、const int变量、int &变量、const int &变量、int *指针所指变量、int *const指针所指变量、const int *指针所指变量、const int *const指针所指变量、类型为int的非左值(比如字面常量100、多项表达式1+50*2)、类型不是int但可转换为int的变量或非左值(比如short变量、多项表达式1.0+50.0*2.0、字面常量100.0)在初始化时赋给crx,也必须在声明时初始化,后续无法更换所引用的变量。变量初始化完成后,其表现与const int类型一致。
常规左值引用变量的初始化用法如下:
//初始化用法一:作为short变量别名
short x = 55;
short & rx = x;
cout << x; //结果为55
cout << rx; //结果为55
cout << &x; //32位系统结果为0x0093F7BC
cout << ℞//32位系统结果为0x0093F7BC
cout << sizeof(x); //结果为2
cout << sizeof(rx);//结果为2
//初始化用法二:作为short变量别名,多层引用
short x = 55;
short & rx = x;
short & rxx = rx;
//初始化用法三:作为short变量别名,指针表示法,指针为short*
short x = 55;
short * px = &x;
short & rx = *px;
//初始化用法四:作为short变量别名,指针表示法,指针为short *const
short x = 55;
short * const px = &x;
short & rx = *px;
被 const 关键字修饰的左值引用变量初始化用法如下:
//初始化用法一:作为short变量别名
short x = 55;
const short & rx = x;
//初始化用法二:作为const short变量别名
const short x = 55;
const short & rx = x;
//初始化用法三:作为short变量别名,多层引用
short x = 55;
short & rx = x;
const short & rxx = rx;
//初始化用法四:作为short变量别名,多层引用,第一层引用为const
short x = 55;
const short & rx = x;
const short & rxx = rx;
//初始化用法五:作为short变量别名,指针表示法,指针为short*
short x = 55;
short * px = &x;
const short & rx = *px;
//初始化用法六:作为short变量别名,指针表示法,指针为const short*
short x = 55;
const short * px = &x;
const short & rx = *px;
//初始化用法七:作为short变量别名,指针表示法,指针为short *const
short x = 55;
short *const px = &x;
const short & rx = *px;
//初始化用法八:作为short变量别名,指针表示法,指针为const short *const
short x = 55;
const short *const px = &x;
const short & rx = *px;
//初始化用法九:将创建临时变量,类型为int的非左值,字面常量
const int & rx = 100;
//初始化用法十:将创建临时变量,类型为int的非左值,多项表达式
const int & rx = 1+50*2;
//初始化用法十一:将创建临时变量,类型不是int但可转换为int的变量
short x = 55;
const int & rx = x;
cout << x; //结果为55
cout << rx; //结果为55
cout << &x; //32位系统结果为0x006FFCF0
cout << ℞//32位系统结果为0x006FFCD8
cout << sizeof(x); //结果为2
cout << sizeof(rx);//结果为4
//初始化用法十二:将创建临时变量,类型不是int但可转换为int的非左值,字面常量
const int & rx = 100.0;
//初始化用法十三:将创建临时变量,类型不是int但可转换为int的非左值,多项表达式
const int & rx = 1.0+50.0*2.0;
将初始化时 int & 与 const int & 可接受的形式列个表,如下:
| 初始化时可接受的形式 | int & 类型 |
const int & 类型 |
|---|---|---|
int 变量 |
可以 | 可以 |
const int 变量 |
不可以 | 可以 |
int & 变量 |
可以 | 可以 |
const int & 变量 |
不可以 | 可以 |
int * 所指变量 |
可以 | 可以 |
int * const 所指变量 |
可以 | 可以 |
const int * 所指变量 |
不可以 | 可以 |
const int * const 所指变量 |
不可以 | 可以 |
形如 100 的 int 字面常量 |
不可以 | 可以(将创建临时变量) |
形如 1+50*2 的 int 多项表达式 |
不可以 | 可以(将创建临时变量) |
类型可以转换为 int 的变量 |
不可以 | 可以(将创建临时变量) |
形如 100.0 可转换为 int 的字面常量 |
不可以 | 可以(将创建临时变量) |
形如 1.0+50.0*2.0 可转换为 int 的多项表达式 |
不可以 | 可以(将创建临时变量) |
C++ 左值引用与 const 关键字的更多相关文章
- C++ 右值引用与 const 关键字
C++11 新增了另一种引用:右值引用(rvalue reference),这种引用可指向右值,是使用 && 声明的.使用右值引用可以减少复制操作,延长临时对象生命周期,提升程序性能. ...
- C++左值引用与右值引用
本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/references-cpp?view=vs-2019 引用,类似于指针,用于存储一个位于内存某处的对象的 ...
- C++11的左值引用与右值引用总结
概念 在C++11中,区别表达式是左值或右值可以做这样的总结:当一个对象被用作右值的时候,用的是对象的值(内容):当对象被用作左值的时候,用的是对象的身份(在内存中的位置).左值有持久的状态,而右值要 ...
- C++11左值引用和右值引用
转载:https://www.cnblogs.com/golaxy/p/9212897.html C++11的左值引用与右值引用总结 概念 1.&与&& 对于在C++中,大家 ...
- 深入学习c++--左值引用和右值引用
#include <iostream> #include <string> #include <vector> using namespace std; int m ...
- c++11 左值引用、右值引用
c++11 左值引用.右值引用 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #i ...
- [C++11]_[0基础]_[左值引用声明和右值引用声明]
场景: 在 remove_reference 结构体中能看到右值引用的身影 &&, 那么这里的右值引用究竟有什么用呢? 常常也发现int& 和int&& 这两种 ...
- 【C/C++开发】C++11:左值引用VS右值引用
左值引用VS右值引用 左值引用对于一般的C++程序员再熟悉不过,但对于右值引用(C++0X新特性),就稍微有点不知所云 左值VS右值 在定义变量的时候,经常会用到左值和右值,比如:int a = 1; ...
- C++的左值,右值,左值引用,右值引用
参考大神链接: https://blog.csdn.net/u012198575/article/details/83142419 1.左值与右值 https://msdn.microsoft.com ...
随机推荐
- NC200211 装备合成
NC200211 装备合成 题目 题目描述 牛牛有 \({x}\) 件材料 \({a}\) 和 \({y}\) 件材料 \({b}\) ,用 \({2}\) 件材料 \({a}\) 和 \({3}\) ...
- VM Ware 给Centos虚拟机配置静态IP
前言:在大家的日常运维工作中,肯定多多少少都会用到虚拟机,但是默认情况下VMware创建的虚拟机每次启动都有可能更换IP这就对我们的工作造成了一定的麻烦,下面我就给大家介绍下,如何给centos虚拟机 ...
- html字符超长后自动隐藏
style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;"
- PaddleOCR系列(二)--hubserving & pdserving & hub install
一.各种部署方式特点及注意事项 简称 hubserving=PaddleHub Serving pdserving=PaddleHub Serving hub install =指通过paddlehu ...
- Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
编辑完 ip地址,要重启网络 sudo service network restart 结果返回错误,错误如下 Restarting network (via systemctl): Job for ...
- 微信小程序使用echarts/数据刷新重新渲染/图层遮挡问题
1.微信小程序使用echarts,首先下载echarts并导入小程序项目中,因小程序后期上线对文件大小有要求,所以建议进行定制下载导入可减少文件大小占比,也可以下载以前旧版本文件比较小的应付使用 下载 ...
- 记一次 .NET 某RFID标签管理系统 CPU 暴涨分析
一:背景 1. 讲故事 前段时间有位朋友说他的程序 CPU 出现了暴涨现象,由于程序是买来的,所以问题就比较棘手了,那既然找到我,就想办法帮朋友找出来吧,分析下来,问题比较经典,有必要和大家做一下分享 ...
- GitLab:Your account has been blocked.
使用git pull 出现"GitLab:Your account has been blocked."错误 背景 多人使用服务器同一用户,在~/.ssh 目录下的公私钥是之前一个 ...
- Seata-初体验以及避坑
Seata是什么 这里引用官方解释 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用 ...
- .net core3.1 abp学习开始(一)
vs版本 2019,链接数据库使用Navicat,数据库MySql abp的官网:https://aspnetboilerplate.com/,我们去Download这里下载一个模板,需要选好Targ ...