zoukankan      html  css  js  c++  java
  • c++11 move构造函数和move operator 函数 学习

    先看个代码吧!!!!!!!!!!

    #include <iostream>
    
    using namespace std;
    
    class A
    {
    public:
    	A(){cout<<"construct1..............."<<endl;}
    	A& operator = (const A&&) {cout<<" operator move"<<endl;}
    	A(const A&&){cout<<"move construct "<<endl;}
    
    	A& operator = (const A&){cout<<"copy operator"<<endl;}
    	A(const A&){cout<<"copy construct"<<endl;}
    };
    int main()
    {	 
    	A a1 = A();  // 这里调用的到底是哪一个构造函数?
    	A a2 = std::move(A()); // 调用什么呢?
    	   a2 = A();//调用operator =(const A&&)
      
        A&& a = A();//只调用默认构造
    	return 0;
    }
    $g++ -std=c++11 -o main *.cpp -fno-elide-constructors 去掉优化
    $main
    construct1............... move construct construct1............... move construct construct1............... operator move construct1...............

    上面的代码如果注释掉9行10行结果如下

    $g++ -std=c++11 -o main *.cpp  -fno-elide-constructors          去掉优化
    $main
    construct1...............
    copy construct
    construct1...............
    copy construct
    construct1...............
    copy operator
    construct1...............

    上面的代码正好验证了一句话     定义了move构造函数后,拷贝构造函数默认为删除的。   不删除也不会有什么影响!!!(目前是这样)

    effective modern cpp   条款17  理解特殊成员函数的生成规则

     你要记住的事
    • 特殊成员函数是那些编译器可能自己帮我们生成的函数:默认构造函数,析构函数,copy操作,move操作。
    • 只有在类中没有显式声明的move操作,copy操作和析构函数时,move操作才被自动生成。
    • 只有在类中没有显式声明的拷贝构造函数的时候,拷贝构造函数才被自动生成。只要存在move操作的声明,拷贝构造函数就会被删除(delete)。拷贝operator=和拷贝构造函数的情况类似。在有显式声明的copy操作或析构函数时,另一个copy操作能被生成,但是这种生成方法是被弃用的
    • 成员函数模板永远不会抑制特殊成员函数的生成。

     还未学完!!!!!!!!

  • 相关阅读:
    Django-(二).模型层
    firewalld
    2.Python爬虫入门二之爬虫基础了解
    1.Python爬虫入门一之综述
    wxpython 安装教程
    使用Pycharm 安装三方库
    Selenium中的webdriver定位元素失败的常见原因
    Linux 配置selenium + webdriver 环境
    类属性、实例属性
    linux 安装mysql数据库
  • 原文地址:https://www.cnblogs.com/zhangkele/p/9086203.html
Copyright © 2011-2022 走看看