網(wǎng)站首頁 編程語言 正文
拷貝構(gòu)造函數(shù)
同一個類的對象在內(nèi)存中有完全相同的結(jié)構(gòu),如果作為一個整體進行復制或稱拷貝是完美可行的,這個拷貝過程只需要拷貝數(shù)據(jù)成員,而函數(shù)成員是公用的(只有一份代碼);在建立對象時可用同一類的另一個對象來初始化該對象的存儲空間,這時所用的構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù)
例如:
class Object { int value; public: Object(int x = 0) :value(x) {} ~Object() {} Object(Object& obj):value(obj.value) { cout << "Copy Create" << endl; } }; int main() { Object obja(10); Object objb(obja);//一個對象初始化另一個對象空間,調(diào)用拷貝構(gòu)造 }
當一個對象去初始化另一個對象空間,調(diào)用拷貝構(gòu)造;若類中沒有寫拷貝構(gòu)造,如同構(gòu)造函數(shù)與析構(gòu)函數(shù)一樣,系統(tǒng)會生成一個缺省的拷貝構(gòu)造函數(shù)
OBject(Object& obj) {}
拷貝構(gòu)造中的引用
如果我們在寫的拷貝構(gòu)造不加引用,這樣會引起死遞歸
//Object(Object& obj):value(obj.value) Object(Object obj):value(obj.value) { cout << "Copy Create" << endl; }
為什么拷貝構(gòu)造函數(shù)必須采用引用傳參,否則會引發(fā)無窮遞歸呢?
這個問題其實很簡單,再復制對象時要分為兩個步驟:
第一步:開辟一個臨時空間;
第二步:由于臨時空間是需要構(gòu)造的,重新調(diào)用拷貝構(gòu)造函數(shù)(無窮遞歸形成…)
同時我們可以在拷貝構(gòu)造參數(shù)前加上一個引用,來限制可能會出現(xiàn)的問題
//Object(Object& obj):value(obj.value) Object(const Object& obj):value(obj.value) { cout << "Copy Create" << endl; } //這里的const修飾,令我們不能修改被拷貝對象
什么情況會使用拷貝構(gòu)造
拷貝構(gòu)造不止在使用一個對象去構(gòu)造另一個對象時調(diào)用,在下面這些情況也會調(diào)用:
class Object{int value;public:Object(){cout << "Object::Object" << this << endl;}Object(int x = 0) :value(x){cout << "Object::Object" << this << endl;}~Object(){cout << "Objecet::~Object" << this << endl;}Object(Object& obj) :value(obj.value){cout << "Copy Create" << this << endl;}void SetValue(int x) { value = x; }int GetValue() const { return value; }};Object fun(Object obj){int val = obj.GetValue();Object obja(val);return obja;}int main(){Object objx(0);Object objy(0);objy = fun(objx);return 0;}class Object { int value; public: Object() { cout << "Object::Object" << this << endl; } Object(int x = 0) :value(x) { cout << "Object::Object" << this << endl; } ~Object() { cout << "Objecet::~Object" << this << endl; } Object(Object& obj) :value(obj.value) { cout << "Copy Create" << this << endl; } void SetValue(int x) { value = x; } int GetValue() const { return value; } }; Object fun(Object obj) { int val = obj.GetValue(); Object obja(val); return obja; } int main() { Object objx(0); Object objy(0); objy = fun(objx); return 0; }
在上面這一段代碼中,我們總共創(chuàng)建了幾個對象呢,我們來看一下
首先①②屬于對象的構(gòu)造,調(diào)用構(gòu)造函數(shù);程序運行到objy = fun(objx);進入到fun函數(shù),這是構(gòu)造臨時對象obj③屬于拷貝構(gòu)造;隨后④構(gòu)造對象obja;最后⑤這里也屬于拷貝構(gòu)造也需要創(chuàng)建一個臨時對象(將亡值)
并且我們無法將fun函數(shù)中obja對象之間return傳回給objy,因為在函數(shù)結(jié)束時obja會析構(gòu)失效,所以這里會創(chuàng)建一個新的臨時對象
總結(jié)
原文鏈接:https://blog.csdn.net/XXXTENTAC1ON/article/details/122484133
相關推薦
- 2022-02-25 commons-fileupload文件上傳的時候?qū)懭雸D片無數(shù)據(jù)
- 2022-05-05 Python學習之列表常用方法總結(jié)_python
- 2022-12-07 C語言程序中結(jié)構(gòu)體的內(nèi)存對齊詳解_C 語言
- 2022-05-21 服務發(fā)現(xiàn)與負載均衡機制Service實例創(chuàng)建_服務器其它
- 2023-06-16 Pytorch中的?torch.distributions庫詳解_python
- 2021-12-14 nginx.pid打開失敗以及失效的解決方案_nginx
- 2022-04-24 Postman設置環(huán)境變量的實現(xiàn)示例_相關技巧
- 2022-04-09 node sass下載失敗解決方案
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支