程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> c++怎樣讓返回對象的函數不調用拷貝構造函數

c++怎樣讓返回對象的函數不調用拷貝構造函數

編輯:更多關於編程

      我們知道拷貝構造函數有兩種“默默”的方式被調用

    1. 想函數傳入 值參數

    2. 函數返回 值類型

    今天我們討論函數返回值類型的情況。

    得到結論是

    1. 當對象有拷貝構造函數(系統為我們生成、或者我們自己寫拷貝構造函數)可以被隱式調用時,函數返回時會使用拷貝構造函數。

    2. 當對象的拷貝構造函數聲明成為explicit(不能被隱式調用時),函數返回時會使用move構造函數。

    先看開始的代碼。

    #include <iostream>
    #include <memory>
    using namespace std;
    
    class Thing{
    
    public:
    	int		member_;
    
    	Thing():member_(0){  //默認構造函數
    	}
    
    	Thing(Thing& other):member_(other.member_){//拷貝構造函數
    			cout << "copy" << endl;
    	}
    	
    	Thing(Thing&& other):member_(other.member_){//move構造函數
    		cout << "move" << endl;
    	}
    };
    
    Thing getThingByReturnValue()
    {
    	Thing thing;
    	thing.member_ = 1;
    	cout << "in method t" <<  &thing.member_ << endl;
    	return thing;//會調用到拷貝構造函數
    }
    
    unique_ptr<int> getBySmartPtr()
    {
    	unique_ptr<int> p(new int);
    	cout << "in method t" << *p << endl;//注意unique_ptr已經重載了*操作符,實際輸出的是裸指針的內存地址
    	return p;//會調用unique_ptr move構造函數
    }
    
    void main()
    {
    	Thing th  = getThingByReturnValue();
    	cout << "out method t" << &th.member_ << endl;
    
    	auto p = getBySmartPtr();
    	cout << "out method t" << *p << endl;//注意unique_ptr已經重載了*操作符,實際輸出的是裸指針的內存地址
    }
    
    /*
    in method       003CF798
    copy
    out method      003CF88C  //可見getThingByReturnValue調用的是Thing的copy構造函數
    in method       -842150451
    out method      -842150451  //可見getBySmartPtr調用的是unique_ptr的move構造函數
    請按任意鍵繼續. . .
    */

    為什麼我們寫的類會調用copy,而unique_ptr會調用move??百思不得其解。。睡覺時想到了,explicit修飾構造函數的用法。給拷貝構造函數加上explicit試試。

    explicit Thing(Thing& other):member_(other.member_){//拷貝構造函數
    	cout << "copy" << endl;
    }
    
    /*
    in method       003EFC18
    move
    out method      003EFD0C
    in method       -842150451
    out method      -842150451
    請按任意鍵繼續. . .
    */
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved