1.概念

1)C++中对象发生拷贝的场景可以分为两种,一种是被拷贝的对象还要继续使用,另一种是被拷贝的对象不再使用;第二种一般可以认为是对右值的拷贝

2)C++11中引入了移动构造函数,对象发生拷贝时不需要重新分配空间而是使用被拷贝对象的内存,从而提高代码运行效率

3)移动构造函数的第一个参数必须是自身类型的右值引用(不需要const,为啥?右值使用const没有意义),若存在额外的参数,任何额外的参数都必须有默认实参

4)移动构造函数构造对象时不再分配新内存,而是接管源对象的内存,移动后源对象进入可被销毁的状态,所以源对象中如果有指针数据成员,那么它们应该在移动构造函数中应该赋值为NULL

5)因为移动操作不分配内存,所以不会抛出任何异常,因此用noexcept指定(如果定义在类的外面,那么定义也要用noexcept指定)

2.合成移动构造函数

1)只有当一个类没有自定义任何拷贝控制成员,且每个非static数据成员都可以移动(数据成员的移动操作未被delete),编译器才会定义合成移动构造函数

2)例外:基类使用“=default”声明了虚析构函数时,且没有自定义其他拷贝控制成员,此时即使这个析构函数指明是编译器合成版本的,编译器也不会合成移动操作(统计显示,编译器合成的移动操作通常会跟虚折构函数有冲突——知乎轮子哥)

3.拷贝构造函数和移动构造函数的匹配

1)既有拷贝构造又有移动构造的话,根据实参来选择使用哪一个

2)如果一个类有拷贝构造函数没有移动构造函数,这时候编译器不会合成移动构造函数,所以无论是左值引用还是右值引用的实参,均使用拷贝构造函数,此时会将右值引用转化为左值引用

3)上述过程用拷贝构造函数代替移动构造函数肯定是安全的:因为拷贝构造函数既满足获得源对象值的要求,并且源对象还处于有效的状态

移动构造函数(c++11)的更多相关文章

  1. 委托构造函数(c++11)

    1.概念 1)委托构造函数也是构造函数,它也有形参列表,它将实参传递给其他的构造函数来初始化类对象,像是把自己的一些(或者全部)构造职责委托给其他构造函数一样

  2. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

  3. [转载] C++11新特性

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  4. 学习C++ -> 构造函数与析构函数

    学习C++ -> 构造函数与析构函数 一.构造函数的介绍    1. 构造函数的作用        构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用 ...

  5. C++11 新知识点

    翻了下新版的C++ Primer,新的C++ 11真是变化很大,新增了很多语法特性.虽然已经很久没在写C++了,但一直对这门经典语言很感兴趣的,大致看了看前几章基础部分,总结下新特性备个忘吧.估计也很 ...

  6. Spark学习笔记11面向对象编程

    面向对象编程   11.1 object类 11.1.1定义一个简单的类   11.1.2 field的getter与setter 定义类包含,定义类的field及方法.其格式如下 class Cla ...

  7. 构造函数 (C++)

    构造函数是一种可初始化其类的实例的成员函数. 构造函数具有与类相同的名称,没有返回值. 构造函数可以具有任意数量的参数,类可以具有任意数量的重载构造函数. 构造函数可以具有任何可访问性(公共.受保护或 ...

  8. c++ primer读书笔记之c++11(三)

    1 =default构造函数限定符 c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数.析构或赋值运算函数.参考代码如下: class CtorDftTy ...

  9. C++之构造函数的继承

    #include<iostream> usingnamespace std; classBase1 { public: Base1()=default; Base1(const strin ...

随机推荐

  1. [LeetCode_96] Unique Binary Search Trees

    题目链接 https://leetcode.com/problems/unique-binary-search-trees/ 题意 计算给定节点数的BST有多少种 思路 递归 相关知识 二叉搜索树(B ...

  2. java web获取客户端外网ip和所在区域

    @参考文章1.@参考文章2.@参考文章3.@参考文章4,@之前同事的项目 controller @Controller @RequestMapping("/home") publi ...

  3. LINUX SSH修改默认22/添加端口

    通常ssh远程登录的默认端口是22,但是因为端口22属于高危端口,因此很多时候作为服务器会被关掉,不过这个端口一般是可以更改或者添加的,这样除了22端口,也可以通过别的端口进行访问. 1.首先修改配置 ...

  4. 编程,将data段中的字符串转化成大写

    assume cs:code data segment db 'conversation' data ends code segment start: mov ax,data mov ds,ax ca ...

  5. JFinal Web开发学习(三)前后台路由设计

    效果图: 一.写控制器 1.在controller包中新建AdminController后台控制器,继承Controller,实现一个index方法,作为的处理方法. /admin 后面,这个控制器中 ...

  6. 转 C++函数返回值,你必须注意的问题

    归根结底,C++所面临的问题要求它提供各种各样的机制以保证性能,也许,这辈子也见不到C++能安全有效的自己进行内存垃圾回收..... 老程序猿都会提醒菜鸟,注意函数的返回值,因为,很可能,你的函数返回 ...

  7. js的回调函数详解

    本文主要介绍了个人对于javascript中回调函数的理解和使用方法及示例,需要的朋友可以参考下   现在做native App  和Web App是主流,也就是说现在各种基于浏览器的web app框 ...

  8. PAT 1012 数字分类 (20)(代码+测试点)

    1012 数字分类 (20)(20 分) 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求 ...

  9. robot framework测试驱动无法定位页面元素

    robot framework错误提示: [ WARN ] Keyword 'Capture Page Screenshot' could not be run on failure: NoSuchW ...

  10. Two Sum II - Input array is sorted LT167

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...