c++右值引用和转移构造函数
int &&i = ; //i绑定到了右值1
int b = ;
cout << i << endl; //输出1
i = b;
cout << i << endl; //输出2
int &&temp = ;
int &&i = temp;
int &&temp = ;
int &&i = ;
i = temp;
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);
}
- 右值引用,是对临时对象的一种引用,它是在初始化时完成引用的,但是右值引用不代表引用临时对象后就不能改变右值引用所引用对象的值,仍然可以在初始化后改变临时对象的值。
- 对于引用类型,可以用于它所引用对象类型的可以用的地方(把它当成普通变量),只不过用到的值是它所引用的对象的值,它还可以用于移动构造或赋值函数的地方。
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;
}
c++右值引用和转移构造函数的更多相关文章
- C++11新特性:右值引用和转移构造函数
问题背景 #include <iostream> using namespace std; vector<int> doubleValues (const vector< ...
- 【转】C++11 标准新特性: 右值引用与转移语义
VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...
- C++11 标准新特性: 右值引用与转移语义
文章出处:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rvalue Referene) ...
- C++11 右值引用和转移语义
新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...
- C++11 右值引用 与 转移语义
新特性的目的 右值引用(R-value Reference)是C++新标准(C++11, 11代表2011年)中引入的新特性,它实现了转移语义(Move Semantics)和精确传递(Perfect ...
- C++右值引用与转移语义
std::forwad? C++11 中定义的 T&& 的推导规则为: 右值实参为右值引用,左值实参仍然为左值引用. 参考: 右值引用与转移语义
- 聊聊 C++ 右值引用 和 移动构造函数
一: 背景 最近在看 C++ 的右值引用和移动构造函数,感觉这东西一时半会还挺难理解的,可能是没踩过这方面的坑,所以没有那么大的深有体会,不管怎么说,这一篇我试着聊一下. 二: 右值引用 1. 它到底 ...
- 右值引用与转移语义(C++11)
参考资料: http://www.cnblogs.com/lebronjames/p/3614773.html 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值.通俗 ...
- C++11新特性,对象移动,右值引用,移动构造函数
C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力.接下来简要介绍一下相关概念. 右值引用 所谓右值引用就是必须绑定到右值的引用.通过 && 而不是 & 来获得右值 ...
随机推荐
- PHP imagecharup - 垂直地画一个字符
imagecharup — 垂直地画一个字符.高佣联盟 www.cgewang.com 语法 bool imagecharup ( resource $image , int $font , int ...
- Newbe.Claptrap 框架如何实现多级生命周期控制?
Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...
- Flexible实现H5移动端适配小demo
前言 看了宇哥关于移动端适配的分享后,加上目前公司项目也需要做移动端适配,今天就抽空搞了搞.目前业界还是比较推崇手淘使用"rem+viewport"的解决方案,今天自己模仿手淘fl ...
- c++日志工具spdLog
c++日志工具spdLog简单使用示例代码 spdlog直接引用头文件就可以使用,这一点还是比较方便的,也是刚入门使用,下面是在源码的示例代码基础上修改测试的代码: #include <cstd ...
- 027_go语言中的通道选择器
代码演示 package main import "fmt" import "time" func main() { c1 := make(chan strin ...
- 全球疫情爬取APP版
全球疫情统计APP图表展示: 将该任务分解成三部分来逐个实现: ①爬取全球的疫情数据存储到云服务器的MySQL上 ②在web项目里添加一个servlet,通过参数的传递得到对应的json数据 ③设计A ...
- 【av68676164(p21-p22)】线程
4.3.1 线程概念 线程的概念(Thread) 线程是可由CPU直接运行的实体 一个进程可以创建多个线程 多个线程可共享CPU可以实现并发运行 CreateThread() 功能:把一个函数创建为一 ...
- Vue中v-model指令的常用修饰符
v-model指令有三个可以选用的修饰符:.lazy..number以及.trim.vue官方对此的描述为: .number-输入字符串转为有效的数字 .lazy-取代input监听change事件 ...
- 【LeetCode/LintCode】 题解丨字节跳动试题:第k大的子数组
给定一个长度为n的数组a,它有n(n+1)/2个子数组.请计算这些子数组的和,然后按照升序排列,并返回排序后第k个数. 1≤n≤10^5 1≤ai≤10^9 1≤k≤n(n+1)/2 在线 ...
- JAVA—继承及抽象类
继承的概念 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法. 与css中继承父元素属性类似 继承的 ...