程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++11 中的移動構造函數

c++11 中的移動構造函數

編輯:C++入門知識

c++11 中的移動構造函數


在現實中有很多這樣的例子,我們將錢從一個賬號轉移到另一個賬號,將手機SIM卡轉移到另一台手機,將文件從一個位置剪切到另一個位置……移動構造可以減少不必要的復制,帶來性能上的提升。

l C++11標准中提供了一種新的構造方法——移動構造。

l C++11之前,如果要將源對象的狀態轉移到目標對象只能通過復制。在某些情況下,我們沒有必要復制對象——只需要移動它們。

l C++11引入移動語義:

n 源對象資源的控制權全部交給目標對象

l 移動構造函數

問題與解決

l 當臨時對象在被復制後,就不再被利用了。我們完全可以把臨時對象的資源直接移動,這樣就避免了多余的復制操作。

\

 

移動構造

l 什麼時候該觸發移動構造?

n 有可被利用的臨時對象

l 移動構造函數:

class_name ( class_name && )

 

例:函數返回含有指針成員的對象(版本1)

l 使用深層復制構造函數

返回時構造臨時對象,動態分配將臨時對象返回到主調函數,然後刪除臨時對象。



 

#include
using namespace std;
class IntNum {
public:
   IntNum(int x = 0) : xptr(new int(x)){ //構造函數
         cout << "Calling constructor..." << endl;
   }
   IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//復制構造函數
         cout << "Calling copy constructor..." << endl;
   };
   ~IntNum(){ //析構函數
         delete xptr;
         cout << "Destructing..." << endl;
   }
   int getInt() {   return *xptr;   }
private:
   int *xptr;
};
 
//返回值為IntNum類對象
IntNum getNum() {
   IntNum a;
   return a;
}
int main() {
   cout<

 

 

例:函數返回含有指針成員的對象(版本2)

l 使用移動構造函數

將要返回的局部對象轉移到主調函數,省去了構造和刪除臨時對象的過程。

#include
using namespace std;
class IntNum {
public:
      IntNum(int x = 0) : xptr(new int(x)){ //構造函數
           cout << "Calling constructor..." << endl;
      }
      IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//復制構造函數
線形標注 3: 注:
?&&是右值引用
?函數返回的臨時變量是右值
           cout << "Calling copy constructor..." << endl;
      }
      IntNum(IntNum && n): xptr( n.xptr){   //移動構造函數
           n.xptr = nullptr;
           cout << "Calling move constructor..." << endl;
      }
      ~IntNum(){ //析構函數
           delete xptr;
           cout << "Destructing..." << endl;
      }
private:
      int *xptr;
};
 
//返回值為IntNum類對象
IntNum getNum() {
IntNum a;
return a;
}
int main() {
cout << getNum().getInt() << endl; return 0;
}
運行結果:
Calling constructor...
Calling move constructor...
Destructing...
0
Destructing...


線形標注 3: 注:?&&是右值引用?函數返回的臨時變量是右值

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved