c++primer plus阅读笔记(十)
来源:互联网 发布:ubuntu wine 迅雷 编辑:程序博客网 时间:2024/05/22 00:33
自增的先后
operator ++ (int) ;a++operator ++ (); ++a
c++左值与右值
右值是一般都是临时对象,可能存在寄存器或可能被编码到机器指令的【立即数】中,所以右值无法使用【’&’】取地址。
int a;a=++a; //a是左值,而++a是operator++()返回的
左值引用和右值引用
int &;//为左值引用int &&;//为右值引用非const右值引用只能用于非const右值
右值与移动构造函数
右值是一个临时对象,在单行域之后生命期就结束了,对于函数返回的临时对象如下,过程是将堆栈对象a直接返回给temp的拷贝构造函数构造(旧式的编译器还会a先赋值给一个临时对象temp返回临时对象temp)
Time fn(){ int a; return a;}Time temp=fn();
但是对于需要大规模new堆和堆内存数据复制的类来说,效率就很低,如下
class Time{public: int *mem; int size; Time(Time& temp){ mem=new int[size]; for(int i=0;i<temp.size;i++){ mem[i]=temp.mem[i]; } }}
此时可以使用移动构造函数,利用函数的重载,将构造函数设置为右值引用类型,直接堆内存指向右值
class Time{public: int *mem; int size; Time(int &&temp){ mem=temp.mem; temp.mem=0;//转移堆内存控制,同时析构函数delete[]0不会出现异常。 size=temp.size; }}
同样可以使用移动语义,对赋值预算符【=】添加一个移动赋值运算符版本
左值与移动构造函数
当一个新的对象使用左值进行构造时,如果希望使用移动构造函数,可以使用std::move(object)函数
下述代码中move会调用对象的移动赋值函数,如果没有的话不允许下述用法。
Time a;Time bb=std::move(a); //使用移动构造函数.
阅读全文
0 0
- c++primer plus阅读笔记(十)
- 《C Primer Plus》阅读笔记(4)
- 《C Primer Plus》阅读笔记(3)
- 《C Primer Plus》阅读笔记(2)
- 《C Primer Plus》开头阅读笔记
- C++primer plus阅读笔记第四章
- c++primer plus阅读笔记(一)
- c++primer plus阅读笔记(二)
- c++primer plus阅读笔记(四)
- c++primer plus阅读笔记(五)
- c++primer plus阅读笔记(六)
- c++primer plus阅读笔记(七)
- c++primer plus阅读笔记(八)
- c++primer plus阅读笔记(九)
- C Primer Plus - 笔记
- c primer plus笔记
- c primer plus 笔记
- 《C Primer Plus》笔记
- c++primer plus阅读笔记(九)
- Synchronized 实现原理
- 一行命令知晓当前Activity
- 线上问题引发的思考---从一个死锁看mysql innodb的锁机制
- linux驱动入门,编译,动态加载
- c++primer plus阅读笔记(十)
- 获取元素,动态添加、删除元素以及getElementByTagName、和getElementByClassName)的用法
- 基于pymongo操作monggodb数据库(包括时间的读写、比较)
- Hbase Java API详解
- Android 文件下载保存读取
- 类和对象、构造方法
- tomcat遇到的问题(一)Error instantiating servlet class[已解决]
- centos文件查找命令
- autoexpect使用