广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 右值引用与 const 关键字详解
  • 947
分享到

C++ 右值引用与 const 关键字详解

2024-04-02 19:04:59 947人浏览 泡泡鱼
摘要

c++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,const关键字是一种修饰符。修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告

c++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,const关键字是一种修饰符。修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有只读的特点。在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。

C++11 新增了另一种引用:右值引用(rvalue reference),这种引用可指向右值,是使用 && 声明的。使用右值引用可以减少复制操作,延长临时对象生命周期,提升程序性能。它一般被用来实现移动语义和完美转发,将 const 关键字用于右值引用的场景不多,这里来总结一下 const 右值引用的特性,对其是否具有实际应用价值不做讨论。右值引用必须在创建的同时进行初始化,且只能使用右值进行初始化,可将 const 关键字用于右值引用,如下所示。

C++11 新增了另一种引用:右值引用(rvalue reference),这种引用可指向右值,是使用 && 声明的。使用右值引用可以减少复制操作,延长临时对象生命周期,提升程序性能。它一般被用来实现移动语义和完美转发,将 const 关键字用于右值引用的场景不多,这里来总结一下 const 右值引用的特性,对其是否具有实际应用价值不做讨论。右值引用必须在创建的同时进行初始化,且只能使用右值进行初始化,可将 const 关键字用于右值引用,如下所示:

//声明并初始化常规右值引用变量
int && rrx = 55;
 
//将const关键字用于右值引用变量,以下几种为等效表示
const int && crrx = 55;
int const && crrx = 55;

在 Microsoft Visual Studio 中连续多个 const 会被编译器解释成一个,即 const const const const int &&const int && 等效,除此之外,const int const && 在 Microsoft Visual Studio 中也与 const int && 等效,而 int && constQt minGW 中将会报错,在 Microsoft Visual Studio 中与 int && 等效。

常规右值引用与 const 右值引用的特性如下:

  • 类型为 int && 的引用只能用来引用右值,不能用来引用左值,后面可修改其值。可将类型为 int 的非左值(比如字面常量 100、多项表达式 1+50*2、函数的 int 返回值)、类型不是 int 但可转换为 int 的非左值(比如多项表达式 1.0+50.0*2.0、字面常量 100.0、函数的 double 返回值)在初始化时赋给 rrx。变量初始化完成后,其地址就固定不变,其表现与 int 类型变量一致,右值引用变量自身属于左值。
  • 类型为 const int && 的引用也只能用来引用右值,不能用来引用左值,但后面不可修改其值。可将类型为 int 的非左值(比如字面常量 100、多项表达式 1+50*2、函数的 int 返回值)、类型不是 int 但可转换为 int 的非左值(比如多项表达式 1.0+50.0*2.0、字面常量 100.0、函数的 double 返回值)在初始化时赋给 crrx。变量初始化完成后,其地址就固定不变,其表现与 const int 类型变量一致,自身也属于左值。

常规右值引用变量的初始化用法如下:

//初始化方式一:字面常量
int && rrx = 100;
int && rrx = 100.0;
 
//初始化方式二:多项表达式
int && rrx = 1+50*2;
int && rrx = 1.0+50.0*2.0;
 
//初始化方式二:函数返回值
int && rrx = abs(10);
int && rrx = sqrt(10.0);

右值引用在部分情况下会生成临时变量(一个典型例子是使用字面常量右值如 100 来初始化右值引用变量),然后将右值引用变量作为该临时变量的别名,这与 const 左值引用十分相似,但与之不同的是:const 左值引用变量初始化完成后其值就无法被修改(权限为只读),右值引用变量初始化完成后其值仍可修改(权限为可读可写)。在另一些情况下,右值引用可以延长已有临时变量的生命周期,减少复制操作的次数(一个典型例子是使用函数返回的类对象来初始化右值引用变量,在关闭编译器优化的情况下可以将本需 2 次的复制操作减少为 1 次)。

const 关键字修饰的右值引用变量初始化用法如下,与常规右值引用变量的区别仅在于它们的可修改属性不同。

//初始化方式一:字面常量
const int && crrx = 100;
const int && crrx = 100.0;
 
//初始化方式二:多项表达式
const int && crrx = 1+50*2;
const int && crrx = 1.0+50.0*2.0;
 
//初始化方式二:函数返回值
const int && crrx = abs(10);
const int && crrx = sqrt(10.0);

将初始化时 int &&const int && 可接受的形式列个表,如下,需要注意的是:可以将右值引用变量用于初始化左值引用变量,但不可将左值引用变量用于初始化右值引用变量,因为右值引用变量自身属于左值。

初始化时可接受的形式int && 类型const int && 类型
int 变量不可以不可以
const int 变量不可以不可以
int & 变量不可以不可以
const int & 变量不可以不可以
int && 变量不可以不可以
const int && 变量不可以不可以
形如 100 的 int 字面常量可以可以
形如 1+50*2 的 int 多项表达式可以可以
返回类型为 int 的函数返回值可以可以
形如 100.0 可转换为 int 的字面常量可以可以
形如 1.0+50.0*2.0 可转换为 int 的多项表达式可以可以

扩展const常量与宏定义的常量的区别:

这个区别用从几个角度来说:

 1.const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

2. define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

3.define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 
由于define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:

#define N 2+3 //我们预想的N值是5,我们这样使用N
double a = N/2;  //我们预想的a的值是2.5,可实际上a的值是3.5

4.占用的空间不同

#define PI 3.14     //预处理后 占用代码段空间
const float PI=3.14;    //本质上还是一个 float,占用数据段空间

5. const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了

到此这篇关于C++ 右值引用与 const 关键字的文章就介绍到这了,更多相关C++ 右值引用const 关键字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 右值引用与 const 关键字详解

本文链接: https://www.lsjlt.com/news/168872.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 右值引用与 const 关键字详解
    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,const关键字是一种修饰符。修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告...
    99+
    2022-11-13
  • 详解C++ 左值引用与 const 关键字
    左值引用是已定义的变量的别名,其主要用途是用作函数的形参,将 const 关键字用于左值引用时,其在初始化时可接受的赋值形式变得更加广泛了,这里来总结一下。 左值引用是已定义的变量的...
    99+
    2022-11-13
  • c++关键字const的用法详解
    目录C语言const的用法1、指向常量的指针变量const int *p指针指向int a;2、常指针(常地址)int * const p指针指向int a;3、指向常量的常指针co...
    99+
    2022-11-12
  • C++ const关键字分析详解
    目录C语言中修饰变量C语言中修饰指针变量C语言中修饰函数的参数C++中修饰变量C++中修饰函数的参数C++中修饰函数的返回值C++中修饰类的成员函数C++中修饰类的成员变量总结C语言...
    99+
    2022-11-12
  • C#中的const和readonly关键字详解
    const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1、声明const类型变量一定要赋初值吗? 一定要赋初值 public class Student ...
    99+
    2022-11-13
    C# const关键字 readonly关键字
  • C++中引用和const关键字介绍
    目录引用常引用const关键字用法1)定义常量2)定义常量指针3)定义常引用总结引用 下面的写法定义了一个引用,并将其初始化为引用某个变量。类型名 & 引用名 = 某变量名;...
    99+
    2022-11-13
  • 详解C++右值引用
    目录概述移动语义(Move Semantics)完美转发(Perfect Forwarding)概述 在C++中,常量、变量或表达式一定是左值(lvalue)或右值(rvalue)。...
    99+
    2022-11-12
  • C++中引用和const关键字怎么用
    今天小编给大家分享一下C++中引用和const关键字怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。引用下面的写法定义了...
    99+
    2023-06-29
  • C语言详细分析讲解关键字const与volatile的用法
    目录一、const 只读变量二、const 全局变量的分歧三、const 的本质四、const 修饰函数参数和返回值五、volatile 解析六、小结一、const 只读变量 con...
    99+
    2022-11-13
  • C++左值与右值,右值引用,移动语义与完美转发详解
    目录C++——左值与右值、右值引用、移动语义与完美转发一、左值和右值的定义二、如何判断一个表达式是左值还是右值(大多数场景)三、C++右值引用四、std::m...
    99+
    2022-11-13
  • C语言关键字const与volatile怎么用
    今天小编给大家分享一下C语言关键字const与volatile怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、con...
    99+
    2023-06-30
  • 一文详解C++中的引用与关键字auto
    目录一.引用1.引用的概念2.引用的使用和问题3.引用与指针的比较二.关键字auto一.引用 1.引用的概念 引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。注意引用...
    99+
    2023-05-16
    C++ 引用 关键字auto C++引用 C++ 关键字auto
  • C++关于const与引用的分析讲解
    目录一、关于 const 的疑问二、关于引用的疑问三、小结一、关于 const 的疑问 const 什么时候为只读变量?什么时候是常量? const 常量的判别准则 只有用字面量初始...
    99+
    2022-11-13
  • C++右值引用与移动构造函数基础与应用详解
    目录1.右值引用1.1左值右值的纯右值将亡值右值1.2右值引用和左值引用2.移动构造函数2.1完美的移动转发1.右值引用 右值引用是 C++11 引入的与 Lambda 表达式齐名的...
    99+
    2023-02-13
    C++右值引用 C++移动构造函数
  • Javathis关键字的引用详解
    目录为什么要有this引用?什么是this引用this引用的特性为什么要有this引用? 我们先看一段代码示例 public class Date { public in...
    99+
    2022-11-13
  • C++11新特性之右值引用与完美转发详解
    目录一、左值与右值二、左值引用与右值引用三、右值引用应用1.移动构造与移动赋值1.模拟实现的string2.移动构造3.移动赋值四、默认移动构造和移动赋值重载函数五、完美转发1.万能...
    99+
    2022-11-13
  • C++ explicit关键字的使用详解
    在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即...
    99+
    2022-11-12
  • C#泛型详解及关键字作用
    这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用。 一、什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (C...
    99+
    2022-11-12
  • 详解C++中inline关键字的作用
    目录inline关键字:目的:原理:注意事项:总结 inline关键字: 目的: 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。 原理: 调用函数的...
    99+
    2022-11-12
  • c语言static关键字用法详解
    目录1.static修饰全局变量2.static修饰函数3.static修饰局部变量总结:1.static修饰全局变量 我们创建两个源文件,一个test.c,一个main.c 现在...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作