c++中&和&&引用工作原理的区别?

我知道引用&和&&分别适用于何中情况,现在恳请指导如下问题:引用&是一个类型变量的别名,如:(int&a=b;)表示的a和b是同一个变量(既a的地址和b的地址相同),那么... 我知道引用&和&&分别适用于何中情况,现在恳请指导如下问题:

引用&是一个类型变量的别名,如:( int &a=b;) 表示的a和b是同一个变量(既a的地址和b的地址相同),那么引用&&表示的是什么?如:(int &&k=i+j;)k 和 i+j 间的联系,请具体说明。
展开
 我来答
匿名用户
推荐于2017-11-21
展开全部

&&就是右值引用, &是普通的左值引用, 左值是可以放在赋值号=左边的值, 右值是只能放在=右边的值, 右值没有一个"变量"名字, i+j返回的值可以视作是放在一个临时存放内存空间里的, 这个空间并不能被用来赋值, 你不能写i+j = 5等; &&可以把这种临时的值和存在变量里的值区分开来


常见应用情况是, 例如String类内部都有一个char *指针pstr指向实际存放字符串的内存, 当写str3 = str1.concat(str2)的时候实际执行了2次构造函数, 第一次是concat构造一个新的String对象, 第二次是赋值的时候执行了一次拷贝构造函数(或者operator=)把concat返回的临时值复制了一次给str3的内存, 然后concat的临时值在之后立即被销毁了, 显然这个第二次拷贝构造很多余

有了&&之后可以给String增加一个参数是&&的拷贝构筑函数以及operator=(&&)来解决这个问题:

String(String &&other) {
    pstr = other.pstr;
    other.pstr = nullptr; //直接把临时值other的pstr拿来用而不再复制一次, 然后把other.pstr置null避免other的析构函数delete pstr
}
更多追问追答
追问

本人是新学员,对string内部成员不尽了解,以下是我对你解释的理解,不知正确与否

追答
把右值赋给const &指向的就是临时空间, 因为标注了const肯定不能作写入或修改只能读取所以没什么关系, 去掉const编译器就该报错了, 另外有的编译器把右值赋给const &也会报错
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式