C++中左值和右值的区别详解

 更新时间:2022年01月27日 08:55:28   作者:king9666  
大家好,本篇文章主要讲的是C++中左值和右值的区别详解,感兴趣的同学赶紧来看一看吧,对你有帮助的话记得收藏一下

左值右值定义:

左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式).

int a;
int b;
a = 1;
b = 2;

a = b;
b = a;

a + b =  3; // 非法表示

右值分为纯右值和将亡值:

纯右值:临时变量和不跟对象关联的字面量值

将亡值:在确保其他变量不再被使用或即将销毁时,通过盗取的方式,可以避免内存空间的释放和分配,能够延长变量值的生命期。右值通常不具有名字,也只能通过引用的方式找到它的存在。

特性

首先, 对于基础类型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修饰(cv-qualitification ignored)

其次,对于自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。

自定义类型应该设计得和内置类型尽量一样(所谓 value type,value semantic),但允许成员函数改变右值这个特性却有意无意使得自定义类型特殊化了。
对此,我们其实可以这样想:自定义类型允许有成员函数,而通过右值调用成员函数是被允许的,但成员函数有可能不是 const 类型,因此通过调用右值的成员函数,也就可能会修改了该右值

左值引用, 右值引用

引用类型本身并不拥有所绑定对象的内存,只是该对象的一个别名。

左值引用是具名变量值的别名,右值引用是不具名(匿名)变量的别名。

常量左值引用是个万能引用类型,可接受常量左值(带有const),非常量左值和右值对其初始化。常量左值引用的右值在其生命期内只能是只读的

请添加图片描述

E.g.1

int &a = 2;       # 左值引用绑定到右值,编译失败

int b = 2;        # 非常量左值
const int &c = b; # 常量左值引用绑定到非常量左值,编译通过
const int d = 2;  # 常量左值
const int &e = c; # 常量左值引用绑定到常量左值,编译通过
const int &b =2;  # 常量左值引用绑定到右值,编程通过

E.g.2

int a;
int &&r1 = c;             # 编译失败
int &&r2 = std::move(a);  # 编译通过

总结

到此这篇关于C++中左值和右值的区别详解的文章就介绍到这了,更多相关C++左值和右值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Boost Tokenizer使用详细讲解

    C++ Boost Tokenizer使用详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 基于C++中常见内存错误的总结

    基于C++中常见内存错误的总结

    本篇文章是对C++中常见的内存错误进行了总结介绍。需要的朋友参考下
    2013-05-05
  • C++中的explicit关键字实例浅析

    C++中的explicit关键字实例浅析

    在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上,再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。接下来给大家介绍 C++中的explicit关键字,需要的朋友可以参考下
    2017-03-03
  • C语言实现单词小帮手

    C语言实现单词小帮手

    这篇文章主要为大家详细介绍了C语言实现单词小帮手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C++中stack容器的使用

    C++中stack容器的使用

    本文主要介绍了C++中stack容器的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 使用mmap实现大文件的复制(单进程和多进程)

    使用mmap实现大文件的复制(单进程和多进程)

    这篇文章主要为大家详细介绍了使用mmap实现大文件的复制,单进程与多进程的两种情况,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • OpenCV图像处理之图像拼接详解

    OpenCV图像处理之图像拼接详解

    本文主要介绍了如何使用C++ OpenCV实现图像景拼接,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以了解一下
    2022-08-08
  • C++基本组件之内存池详解

    C++基本组件之内存池详解

    这篇文章主要为大家详细介绍了C++中的基本组件——内存池的相关知识,文中的示例代码讲解详细,对我们学习C++有一定的帮助,需要的可以参考一下
    2023-03-03
  • C++内存泄漏及检测工具详解

    C++内存泄漏及检测工具详解

    最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控
    2013-10-10
  • C实现与 uint64_t 相同功能的类

    C实现与 uint64_t 相同功能的类

    本文给大家分享的是笔者实现的仿uint64_t的类,可以用在不支持uint64_t的平台上,虽然现在功能还不完善,但是还是分享给大家,也算是给大家一个思路吧。
    2015-12-12

最新评论