c++ 移動構造相關總結

 下面隨筆給出c++移動構造。

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

  • C++11標準中提供瞭一種新的構造方法——移動構造。
  • C++11之前,如果要將源對象的狀態轉移到目標對象隻能通過復制。在某些情況下,我們沒有必要復制對象——隻需要移動它們。
  • C++11引入移動語義:

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

  • 移動構造函數

問題與解決

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

移動構造

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

                有可被利用的臨時對象

  • 移動構造函數:

     class_name ( class_name && )

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

//使用深層復制構造函數

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

#include<iostream>

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<<getNum().getInt()<<endl;

  return 0;

}

//運行結果:

Calling constructor...

Calling copy constructor...

Destructing...

0

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

//使用移動構造函數

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

#include<iostream>

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(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...

以上就是c++ 移動構造相關總結的詳細內容,更多關於c++ 移動構造的資料請關註WalkonNet其它相關文章!

推薦閱讀: