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)
~
-------------------------------

  擴展html

將拷貝構造函數聲明爲explicit,則會阻止隱式拷貝構造函數的調用.隱式拷貝構造函數的調用主要發生在三個點:ios

1.一個對象做爲函數參數,以值傳遞的方式傳入函數體函數

2.一個對象做爲函數返回值,以值傳遞的方式從函數返回測試

3.以AAA = xxx的方式建立對象AAA,xxx爲與AAA爲同類型的對象.優化

於是,將拷貝構造函數聲明成explicit並非良好的設計,通常只將有單個參數的constructor聲明爲explicit,而copy constructor不要聲明爲explicit.spa

參考http://www.cnblogs.com/dwdxdy/archive/2012/07/17/2595479.html設計

相關文章
相關標籤/搜索