c++ 移動構(gòu)造相關(guān)總結(jié)
下面隨筆給出c++移動構(gòu)造。
在現(xiàn)實中有很多這樣的例子,我們將錢從一個賬號轉(zhuǎn)移到另一個賬號,將手機SIM卡轉(zhuǎn)移到另一臺手機,將文件從一個位置剪切到另一個位置……移動構(gòu)造可以減少不必要的復(fù)制,帶來性能上的提升。
- C++11標準中提供了一種新的構(gòu)造方法——移動構(gòu)造。
- C++11之前,如果要將源對象的狀態(tài)轉(zhuǎn)移到目標對象只能通過復(fù)制。在某些情況下,我們沒有必要復(fù)制對象——只需要移動它們。
- C++11引入移動語義:
源對象資源的控制權(quán)全部交給目標對象
- 移動構(gòu)造函數(shù)
問題與解決
當臨時對象在被復(fù)制后,就不再被利用了。我們完全可以把臨時對象的資源直接移動,這樣就避免了多余的復(fù)制操作。

移動構(gòu)造
- 什么時候該觸發(fā)移動構(gòu)造?
有可被利用的臨時對象
- 移動構(gòu)造函數(shù):
class_name ( class_name && )
//例:函數(shù)返回含有指針成員的對象(版本1)
//使用深層復(fù)制構(gòu)造函數(shù)
//返回時構(gòu)造臨時對象,動態(tài)分配將臨時對象返回到主調(diào)函數(shù),然后刪除臨時對象。
#include<iostream>
using namespace std;
class IntNum {
public:
IntNum(int x = 0) : xptr(new int(x)){ //構(gòu)造函數(shù)
cout << "Calling constructor..." << endl;
}
IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//復(fù)制構(gòu)造函數(shù)
cout << "Calling copy constructor..." << endl;
};
~IntNum(){ //析構(gòu)函數(shù)
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;
}
//運行結(jié)果:
Calling constructor...
Calling copy constructor...
Destructing...
0
Destructing...
//例:函數(shù)返回含有指針成員的對象(版本2)
//使用移動構(gòu)造函數(shù)
//將要返回的局部對象轉(zhuǎn)移到主調(diào)函數(shù),省去了構(gòu)造和刪除臨時對象的過程。
#include<iostream>
using namespace std;
class IntNum {
public:
IntNum(int x = 0) : xptr(new int(x)){ //構(gòu)造函數(shù)
cout << "Calling constructor..." << endl;
}
IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//復(fù)制構(gòu)造函數(shù)
cout << "Calling copy constructor..." << endl;
//注:
//•&&是右值引用
//•函數(shù)返回的臨時變量是右值
}
IntNum(IntNum && n): xptr( n.xptr){ //移動構(gòu)造函數(shù)
n.xptr = nullptr;
cout << "Calling move constructor..." << endl;
}
~IntNum(){ //析構(gòu)函數(shù)
delete xptr;
cout << "Destructing..." << endl;
}
private:
int *xptr;
};
//返回值為IntNum類對象
IntNum getNum() {
IntNum a;
return a;
}
int main() {
cout << getNum().getInt() << endl; return 0;
}
//運行結(jié)果:
Calling constructor...
Calling move constructor...
Destructing...
0
Destructing...
以上就是c++ 移動構(gòu)造相關(guān)總結(jié)的詳細內(nèi)容,更多關(guān)于c++ 移動構(gòu)造的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識
這篇文章主要介紹了深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識,包括類型轉(zhuǎn)換運算符函數(shù)等內(nèi)容,需要的朋友可以參考下2015-09-09
利用rapidjson實現(xiàn)解析嵌套的json的方法示例
今天小編就為大家分享一篇關(guān)于利用rapidjson實現(xiàn)解析嵌套的json的方法示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
C++20 新特性 協(xié)程 Coroutines(2)
上篇文章簡單給大介紹了 C++20 特性 協(xié)程 Coroutines co_yield 和 co_return 那么這篇文章繼續(xù)給大家介紹C++20 的新特性協(xié)程 Coroutines co_await,需要的朋友可以參考一下2021-10-10
C++11的函數(shù)包裝器std::function使用示例
C++11引入的std::function是最常用的函數(shù)包裝器,它可以存儲任何可調(diào)用對象并提供統(tǒng)一的調(diào)用接口,以下是關(guān)于函數(shù)包裝器的詳細講解,包括它的基本用法、特點、限制、以及與其他相關(guān)機制的對比2024-12-12
C++聲明extern變量和extern函數(shù)的用法
extern關(guān)鍵字可以用來聲明變量和函數(shù)作為外部變量或者外部函數(shù)供其它文件使用,所以本文給大家介紹了C++聲明extern變量和extern函數(shù)的用法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-11-11

