int &&i = ;   //i绑定到了右值1
int b = ;
cout << i << endl; //输出1
i = b;
cout << i << endl; //输出2
为了支持移动操作(包括转移构造函数和转移赋值函数),C++引入了一种新的引用类型——右值引用,使用右值引用的代码可以自由的接管所引用对象的内容。
左值引用绑定的是返回左值引用的函数、赋值、下标、解引用、前置递增递减;右值只能绑定到临时对象,所引用的对象将要销毁或该对象没有其他用户。
 
初始化时,右值引用一定要用一个右值表达式绑定;初始化之后,可以用左值表达式修改右值引用的所引用临时对象的值
int &&temp = ;
int &&i = temp;
temp是一个右值引用变量,变量是左值,因此i引用temp左值是非法的
int &&temp = ;
int &&i = ;
i = temp;
取出temp所引用临时对象的值,再赋值给i所引用临时对象的值。
class A{
public:
int b;
int a;
char c[];
};
void f(A a)
{
;
}
int main(int argc, char const *argv[])
{
A &&a = A();
f(a);
}
生成a引用临时对象的一个副本,再传入副本对象的地址。如果f函数的形参是引用类型的,那么调用f函数传入的是a引用对象的地址,而不会生成副本
 
总结:
  1. 右值引用,是对临时对象的一种引用,它是在初始化时完成引用的,但是右值引用不代表引用临时对象后就不能改变右值引用所引用对象的值,仍然可以在初始化后改变临时对象的值。
  2. 对于引用类型,可以用于它所引用对象类型的可以用的地方(把它当成普通变量),只不过用到的值是它所引用的对象的值,它还可以用于移动构造或赋值函数的地方。
 
class A{
char *p;
public:
A(char *str){p = new char[strlen(str)+]; strcpy(p , str);}
A(const A& x){p = new char[strlen(x.p)+]; strcpy(p , x.p);}
~A(){delete []p; p = NULL;}
A& operator=(const A& x){
if(&x==this) return *this;
delete []p;
p = new char[strlen(x.p)+];
strcpy(p , x.p);
return *this;
}
}
A f(){
A t(“");
return t; //创建返回值对象,调用拷贝构造函数用t对其初始化,随后对象t消亡
}
int main(){
A a = “abcd”;
a = f(); //调用重载的赋值操作符,把函数f返回的临时对象赋值给a,随后临时对象消亡
}
转移构造函数:
A(A&& x){p = x.p; x.p = NULL;}   

编译程序发现t是即将消亡的对象,把它编译成调用转移构造函数。对象t消亡时不需要归还空间,等待返回值对象消亡才归还。

转移赋值函数:
A &operator=(A&& x){
if(&x==this) return *this;
delete []p;
p = x.p;
x.p = NULL;
return *this;
}

最新文章

  1. git在分支上创建目录和文件
  2. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
  3. 51nod1417 天堂里的游戏
  4. Nginx开启Gzip压缩大幅提高页面加载速度(转)
  5. Javascript执行环境、作用域链
  6. WinForm 控件(上)
  7. JS——控制标记的样式
  8. ios 苹果手机硬件摘要
  9. Struts2.5 利用Ajax将json数据传值到JSP
  10. 关于celery django django-celery版的搭配的报错问题及解决方法
  11. poj1417菜鸡的详细题解(希望能帮助到和我一样陷于本题的新手)
  12. 打开即时通讯服务器openfire的大门
  13. KeepAlived(三):vrrp实例故障转移(keepalived+haproxy)
  14. javascript作用域、闭包、对象与原型链
  15. bzoj1692
  16. laravel 添加验证码
  17. 5.Xilinx RapidIO核例子工程源码分析
  18. Java设计模式(12)迭代模式(Iterator模式)
  19. 转oracle 学习 - 表空间
  20. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第三步:需要注意事项

热门文章

  1. Linux下给PHP安装redis扩展
  2. MyBatis--动态插入多条数据
  3. Logback配置文件这么写,还愁不会整理日志?
  4. Day15_redis安装及配置
  5. Day01_SpringBoot
  6. Series结构(常用)
  7. PHP readlink() 函数
  8. PHP highlight_file() 函数
  9. CF R 635 div2 1337D Xenia and Colorful Gems 贪心 二分 双指针
  10. 剑指 Offer 58 - II. 左旋转字符串