左值引用是已定义的变量的别名,其主要用途是用作函数的形参,通过将左值引用变量用作参数,函数将使用原始数据,而不是副本。引用变量必须在声明时同时初始化,可将 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 & constQT 中将会报错,在 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 << &rx;//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 << &rx;//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 所指变量 不可以 可以
形如 100int 字面常量 不可以 可以(将创建临时变量)
形如 1+50*2int 多项表达式 不可以 可以(将创建临时变量)
类型可以转换为 int 的变量 不可以 可以(将创建临时变量)
形如 100.0 可转换为 int 的字面常量 不可以 可以(将创建临时变量)
形如 1.0+50.0*2.0 可转换为 int 的多项表达式 不可以 可以(将创建临时变量)

C++ 左值引用与 const 关键字的更多相关文章

  1. C++ 右值引用与 const 关键字

    C++11 新增了另一种引用:右值引用(rvalue reference),这种引用可指向右值,是使用 && 声明的.使用右值引用可以减少复制操作,延长临时对象生命周期,提升程序性能. ...

  2. C++左值引用与右值引用

    本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/references-cpp?view=vs-2019 引用,类似于指针,用于存储一个位于内存某处的对象的 ...

  3. C++11的左值引用与右值引用总结

    概念 在C++11中,区别表达式是左值或右值可以做这样的总结:当一个对象被用作右值的时候,用的是对象的值(内容):当对象被用作左值的时候,用的是对象的身份(在内存中的位置).左值有持久的状态,而右值要 ...

  4. C++11左值引用和右值引用

    转载:https://www.cnblogs.com/golaxy/p/9212897.html C++11的左值引用与右值引用总结 概念 1.&与&&  对于在C++中,大家 ...

  5. 深入学习c++--左值引用和右值引用

    #include <iostream> #include <string> #include <vector> using namespace std; int m ...

  6. c++11 左值引用、右值引用

    c++11 左值引用.右值引用 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #i ...

  7. [C++11]_[0基础]_[左值引用声明和右值引用声明]

    场景: 在 remove_reference 结构体中能看到右值引用的身影 &&, 那么这里的右值引用究竟有什么用呢? 常常也发现int& 和int&& 这两种 ...

  8. 【C/C++开发】C++11:左值引用VS右值引用

    左值引用VS右值引用 左值引用对于一般的C++程序员再熟悉不过,但对于右值引用(C++0X新特性),就稍微有点不知所云 左值VS右值 在定义变量的时候,经常会用到左值和右值,比如:int a = 1; ...

  9. C++的左值,右值,左值引用,右值引用

    参考大神链接: https://blog.csdn.net/u012198575/article/details/83142419 1.左值与右值 https://msdn.microsoft.com ...

随机推荐

  1. HiEngine:可媲美本地的云原生内存数据库引擎

    摘要:HiEngine与华为GaussDB (for MySQL)集成,将内存数据库引擎的优势带到云端,并与基于磁盘的引擎共存.HiEngine的性能比传统的以存储为中心的解决方案高出7.5倍. 本文 ...

  2. chrome请求cgi遇到net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)

    测试一个web demo的时候,通过chrome请求板子上的web server的cgi时总是提示:net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK) 搜遍整个 ...

  3. 【最全】CSS盒子(div)水平垂直居中居然还有这种方式

    最全的CSS盒子(div)水平垂直居中布局,对CSS 布局掌握程度决定你在 Web 开发中的开发页面速度. 相对于屏幕 方法一:利用定位 <div class="box"&g ...

  4. springboot中的任务处理

    springboot中的任务处理 一.异步任务 在开发中有时用户提交的数据,后台需要一定时间才能做出响应,此时用户在前台也不能在等待中,此时就应该先开启异步请求处理,利用多线程,先给前台反馈,后台另一 ...

  5. 阈值PSI代码

    阈值PSI 若交集数量超过某个给定阈值时,允许分布式的各个参与方在自己集合中找到交集,且除了交集外,得不到其他额外信息. 实现论文: Multi-Party Threshold Private Set ...

  6. 2022-7-12 javascript(2) 第七组 刘昀航

    @ 目录 2022-7-12学习 第七组 刘昀航 前情提要 一.for循环 二.for in循环 三.while 和 do...while循环 1.while do... while 四.内置函数 五 ...

  7. nginx概述及配置

    Nginx是什么? Nginx是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器.因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名.20 ...

  8. 素数算法(Prime Num Algorithm)

    素数算法(Prime Num Algorithm) 数学是科学的皇后,而素数可以说是数学的最为核心的概念之一.围绕素数产生了很多伟大的故事,最为著名莫过于哥德巴赫猜想.素数定理和黎曼猜想(有趣的是,自 ...

  9. github碰到的问题

    下载问题 自己编译一下 mvn clear mvn compile mvn package 自己编译之后的文件,然后解压即可,第一次自己傻傻的,直接用源码跑,少报错! 项目预览问题 添加1s即可 下载 ...

  10. 5.1 从C到C++

    在前4章中介绍了C语言的主要内容,已经足以应付许多算法竞赛的题目了,然而能写不代表好写,有些虽然能够用C语言实现,但是使用C++写起来往往会更快,并且不容易出错 从c到c++ C语言是一门很有用的语言 ...