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

移動(dòng)構(gòu)造
- 什么時(shí)候該觸發(fā)移動(dòng)構(gòu)造?
有可被利用的臨時(shí)對(duì)象
- 移動(dòng)構(gòu)造函數(shù):
class_name ( class_name && )
//例:函數(shù)返回含有指針成員的對(duì)象(版本1)
//使用深層復(fù)制構(gòu)造函數(shù)
//返回時(shí)構(gòu)造臨時(shí)對(duì)象,動(dòng)態(tài)分配將臨時(shí)對(duì)象返回到主調(diào)函數(shù),然后刪除臨時(shí)對(duì)象。
#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類(lèi)對(duì)象
IntNum getNum() {
IntNum a;
return a;
}
int main() {
cout<<getNum().getInt()<<endl;
return 0;
}
//運(yùn)行結(jié)果:
Calling constructor...
Calling copy constructor...
Destructing...
0
Destructing...
//例:函數(shù)返回含有指針成員的對(duì)象(版本2)
//使用移動(dòng)構(gòu)造函數(shù)
//將要返回的局部對(duì)象轉(zhuǎn)移到主調(diào)函數(shù),省去了構(gòu)造和刪除臨時(shí)對(duì)象的過(guò)程。
#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ù)返回的臨時(shí)變量是右值
}
IntNum(IntNum && n): xptr( n.xptr){ //移動(dòng)構(gòu)造函數(shù)
n.xptr = nullptr;
cout << "Calling move constructor..." << endl;
}
~IntNum(){ //析構(gòu)函數(shù)
delete xptr;
cout << "Destructing..." << endl;
}
private:
int *xptr;
};
//返回值為IntNum類(lèi)對(duì)象
IntNum getNum() {
IntNum a;
return a;
}
int main() {
cout << getNum().getInt() << endl; return 0;
}
//運(yùn)行結(jié)果:
Calling constructor...
Calling move constructor...
Destructing...
0
Destructing...
以上就是c++ 移動(dòng)構(gòu)造相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于c++ 移動(dòng)構(gòu)造的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
超詳細(xì)VScode調(diào)試教程tasks.json和launch.json的設(shè)置
vscode是一個(gè)輕量級(jí)的文本編輯器,但是它的擴(kuò)展插件可以讓他拓展成功能齊全的IDE,這其中就靠的是tasks.json和launch.json的配置,下面這篇文章主要給大家介紹了關(guān)于超詳細(xì)VScode調(diào)試教程tasks.json和launch.json設(shè)置的相關(guān)資料,需要的朋友可以參考下2022-10-10
如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器詳解
這篇文章主要給大家介紹了關(guān)于如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
C語(yǔ)言入門(mén)篇--定義宏#define的概述
本篇文章是C語(yǔ)言系列基礎(chǔ)篇,適合c語(yǔ)言剛?cè)腴T(mén)的朋友,本文對(duì)關(guān)于c語(yǔ)言的定義宏#define作了簡(jiǎn)要的概述,希望可以幫助大家快速入門(mén)c語(yǔ)言的世界,更好的理解c語(yǔ)言2021-08-08
深入了解C語(yǔ)言字符函數(shù)和字符串函數(shù)
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言字符/字符串的相關(guān)函數(shù),文中通過(guò)示例代碼總結(jié)的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
C語(yǔ)言超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中的線(xiàn)性表
線(xiàn)性表,數(shù)據(jù)結(jié)構(gòu)中最簡(jiǎn)單的一種存儲(chǔ)結(jié)構(gòu),專(zhuān)門(mén)用于存儲(chǔ)邏輯關(guān)系為"一對(duì)一"的數(shù)據(jù)。線(xiàn)性表是基于數(shù)據(jù)在實(shí)際物理空間中的存儲(chǔ)狀態(tài),又可細(xì)分為順序表(順序存儲(chǔ)結(jié)構(gòu))和鏈表2022-05-05
QT5?Thread線(xiàn)程的具體實(shí)現(xiàn)
本文主要介紹了QT5?Thread線(xiàn)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
淺談2路插入排序算法及其簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了淺談2路插入排序算法及其簡(jiǎn)單實(shí)現(xiàn),雖算不上是常用的排序方法,但在數(shù)據(jù)庫(kù)等方面依然有用上的機(jī)會(huì),需要的朋友可以參考下2015-08-08
C++使用grpc實(shí)現(xiàn)回射服務(wù)器
gRPC是由Google開(kāi)發(fā)的一個(gè)開(kāi)源的高性能遠(yuǎn)程過(guò)程調(diào)用(RPC)框架,用于在分布式系統(tǒng)中實(shí)現(xiàn)跨語(yǔ)言的服務(wù)通信,本文我們就來(lái)看看C++如何使用grpc實(shí)現(xiàn)回射服務(wù)器2024-10-10
C語(yǔ)言中操作密碼文件的一些函數(shù)總結(jié)
這篇文章主要介紹了C語(yǔ)言中操作密碼文件的一些函數(shù)總結(jié),包括setpwent()函數(shù)和getpwent()函數(shù)以及endpwent()函數(shù),需要的朋友可以參考下2015-08-08

