栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

c++ | 左值引用 & 右值引用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ | 左值引用 & 右值引用

左值:可以取地址的、有名字的就是左值,比如 int a;
右值:不能取地址的是右值,表达式结束后就会被销毁, 比如 a*3

左值引用:就是普通引用,是为对象起的别名,必须被初始化,与变量绑定到一起
如:int &b = a;
注意:b不可以引用const a,但const b 可以引用 const a,也可以a*3, 也可以const a*3
也就是说,当b是const时,可以引用右值

右值引用:引用的是右值。。
如: int &&c = 10;
        int &&c = a * 3;
注意:c不可以引用 const a*3,const c 可以引用 const a*3,但是有无const的 a 都不行!
也就是说,c无论如何也不能引用左值-----解决方案是用std::move()


c++ 11加入右值引用的目的:

替代需要销毁对象的拷贝,提高效率:c++在之前,移动对象时是把原来的对象拷贝到新的地方,然后删除原来的对象

引入右值引用后,就可以让新对象直接使用旧内存并且销毁原对象,这样就减少了内存和运算资源的使用,从而提高了运行效率(也就是移动构造的思想)


应用1 移动构造:

拷贝构造见c++ | 构造、拷贝构造、赋值、析构 | 「亲自定义private构造函数来拒绝编译器提供的default函数」_tuuzkiii_Tuu的博客-CSDN博客

class Widget{
public:
    int p;
    Widget();                                 // 构造函数
    Widget(const Widget& rhs) {               // 自定义拷贝构造函数
        p = new int (*(rhs.p));
    }
    Widget(Widget&& rhs) {                    // 移动构造函数
        p = rhs.p;
        rhs.p = NULL;
    }
    ...    
};
 

应用2 容器相关:

当vector的存储容量需要增长时,通常会重新申请一块内存,并把原来的内容一个个复制过去并删除,但现在只需要移动

容器中可以存放右值:vec.push_back("abc")

vector vec2(const string& s);
vector vec1 = vec2("abc");
原本是会调用拷贝构造的,现在会调用移动构造,vec1直接取走临时对象的堆上内存

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1040630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号