zoukankan      html  css  js  c++  java
  • c++拷贝构造和编译优化

    #include <iostream>
     
    using namespace std;
     
    class MyClass
    {
    public:
       MyClass();
       MyClass(int i);
       MyClass(const MyClass &c);
       ~MyClass();
    
       //后面main中测试发现func1 和func2之后没有调用拷贝构造,应该是被优化了
       MyClass  func1(int i){
                    cout<<"func1"<<endl;
                    return MyClass(0);
       }
       MyClass  func2(int i){
                MyClass a;
                    cout<<"func2"<<endl;
                    return a;
       }  
    
    private:
       int m_i;
    
    };
     
    MyClass::MyClass()
    {
        m_i = 0;
        cout << "MyClass()" << endl;
    }
    MyClass::MyClass(int i)
    {
        m_i = i;
        cout << "MyClass(int i)" << endl;
    }
     
    MyClass::MyClass(const MyClass &c)
    {
        m_i = c.m_i;
        cout << "MyClass(const MyClass &c)" << endl;
    }
    
    //这里调用了两次拷贝构造函数&c
    MyClass test(const MyClass c)
    {
        cout << "test" << endl;
            return c;
    }
    
    MyClass::~MyClass()
    {
            cout<<"~"<<endl; 
    }
    
    int main()
    {
            MyClass c2;
        cout << "-------------------------------" << endl;
        MyClass c1=c2.func2(2);   
        cout << "-------------------------------" << endl;
            MyClass c3=test(c2);
        cout << "-------------------------------" << endl;
        
        return 0;
    }
    
    //结果如下
    MyClass()
    -------------------------------
    func1
    MyClass(int i)
    -------------------------------
    MyClass()
    func2
    -------------------------------
    MyClass(const MyClass &c)
    test
    MyClass(const MyClass &c)
    ~
    -------------------------------
    

      扩展

    将拷贝构造函数声明为explicit,则会阻止隐式拷贝构造函数的调用.隐式拷贝构造函数的调用主要发生在三个点:

    1.一个对象作为函数参数,以值传递的方式传入函数体

    2.一个对象作为函数返回值,以值传递的方式从函数返回

    3.以AAA = xxx的方式创建对象AAA,xxx为与AAA为同类型的对象.

    因而,将拷贝构造函数声明成explicit并不是良好的设计,一般只将有单个参数的constructor声明为explicit,而copy constructor不要声明为explicit.

    参考http://www.cnblogs.com/dwdxdy/archive/2012/07/17/2595479.html

  • 相关阅读:
    洛谷 P1767 家族_NOI导刊2010普及(10)
    洛谷 P2919 [USACO08NOV]守护农场Guarding the Farm
    COGS 1619. [HEOI2012]采花
    UVA 11181 Probability|Given
    hdu 3336 Count the string
    洛谷 P2176 [USACO14FEB]路障Roadblock
    洛谷 P2691 逃离
    BZOJ 1040: [ZJOI2008]骑士
    vijos 1320 清点人数
    POJ 3417 Network
  • 原文地址:https://www.cnblogs.com/zhaoyl/p/5396673.html
Copyright © 2011-2022 走看看