網(wǎng)站首頁 編程語言 正文
前言
眾所周知,構(gòu)造函數(shù)的作用是類在創(chuàng)建對(duì)象時(shí)的初始化,而拷貝構(gòu)造函數(shù)則是構(gòu)造函數(shù)里的一種特殊構(gòu)造。
拷貝構(gòu)造函數(shù)
拷貝構(gòu)造:是C++特有的,他是一種特殊的構(gòu)造函數(shù)
用于基于一個(gè)同一個(gè)類的的第一個(gè)對(duì)象去創(chuàng)造和初始化的一個(gè)對(duì)象
第一的參數(shù)是本類的對(duì)象的引用(const)
一、什么是拷貝構(gòu)造函數(shù)
一種特殊的構(gòu)造函數(shù),同一個(gè)類的一個(gè)對(duì)象去創(chuàng)造或初始化一個(gè)對(duì)象
在沒寫的時(shí)候,是默認(rèn)存在的,自己寫了之后,系統(tǒng)默認(rèn)的就會(huì)消失(這一點(diǎn),就是構(gòu)造函數(shù))
拷貝構(gòu)造函數(shù)可以實(shí)現(xiàn):對(duì)象的復(fù)制
class Monster { public: Monster(Monster& m) //拷貝構(gòu)造函數(shù)(默認(rèn)形態(tài)) { //默認(rèn)的拷貝構(gòu)造函數(shù)(默認(rèn)形態(tài)),將對(duì)象一一對(duì)應(yīng)給值 cout << "默認(rèn)的拷貝構(gòu)造函數(shù)(默認(rèn)形態(tài)) " << endl; this->hp = m.hp; } Monster(int hp); //構(gòu)造函數(shù) ~Monster(); //析構(gòu)函數(shù) void show(); private: int hp; }; int main() { Monster monster1(100); monster1.show(); Monster monster3 = monster1;//使用monster1給monster3初始化 monster3.show(); Monster monster4(monster1);//使用monster1去構(gòu)造monster4 monster4.show(); return 0; } Monster::Monster(int hp) { cout << "調(diào)用了帶參構(gòu)造函數(shù)" << endl; this->hp = hp; } Monster::~Monster() { cout << "調(diào)用了析構(gòu)函數(shù)" << endl; } void Monster::show() { cout << "調(diào)用了顯示函數(shù)" << endl; cout<<this->hp << "" << endl; }
二、調(diào)用時(shí)機(jī)
一、函數(shù)的參數(shù)是:“類的對(duì)象”
二、函數(shù)的返回值是類的對(duì)象
三、使用一的對(duì)象給另一個(gè)對(duì)象初始化
四、使用一個(gè)對(duì)象構(gòu)造另一個(gè)對(duì)象
注意
賦值不屬于拷貝構(gòu)造,所以不調(diào)用拷貝構(gòu)造函數(shù)
淺拷貝和深拷貝
淺拷貝就是默認(rèn)的拷貝構(gòu)造函數(shù),這個(gè)拷貝構(gòu)造的操作,我們可以理解為,是用‘=’號(hào)一個(gè)一個(gè)的賦值的,我們將之稱為,淺拷貝,因?yàn)樵谟弥羔樀臅r(shí)候就可以能會(huì)出現(xiàn)問,因?yàn)槲覀冎纼蓚€(gè)同等類型的指針之間用‘=’號(hào)賦值,是兩個(gè)指針的地址指向同一個(gè)內(nèi)存,那么就可能會(huì)存在一個(gè)問題,就是兩個(gè)對(duì)象的指針都指向同一個(gè)內(nèi)存,那么如果其中一個(gè)對(duì)象把該內(nèi)存釋放了,就會(huì)導(dǎo)致另外一個(gè)對(duì)象的指針變成野指針。?
為此,我們就需要進(jìn)行到深拷貝。
public: int *p; Rect(); ~Rect(); int width;//寬 int height;//高 //重載拷貝構(gòu)造,實(shí)現(xiàn)淺拷貝拷貝 Rect(Rect&rect) { this->height = rect.height; this->width = rect.width; this->p=rect.p; }
public: int *p; Rect(); ~Rect(); int width;//寬 int height;//高 //重載拷貝構(gòu)造,實(shí)現(xiàn)深拷貝 Rect(Rect&rect) { this->height = rect.height; this->width = rect.width; this->p = new int;//重新申請(qǐng)內(nèi)存 *p = *rect.p;//拷貝之前的值 }
可見,淺拷貝與深拷貝的差距就是前者是直接拷貝指針,讓兩個(gè)指針同時(shí)指向一個(gè)地址,這樣一方進(jìn)行析構(gòu)的時(shí)候,另一方就會(huì)成為野指針,而深拷貝就是避免了這一點(diǎn),申請(qǐng)一塊新內(nèi)存,并復(fù)制這塊內(nèi)存的數(shù)據(jù)。
總結(jié)
原文鏈接:https://blog.csdn.net/qq_60669466/article/details/122312424
相關(guān)推薦
- 2023-07-18 SpringBoot中線程池初始化,并且可配置線程池參數(shù)
- 2022-10-12 no-bundle?構(gòu)建原理淺析_web2.0
- 2022-03-30 一篇文章帶你了解C語言的選擇結(jié)構(gòu)_C 語言
- 2022-03-16 Linux下安裝軟件包報(bào)依賴等相關(guān)問題的解決方法_Linux
- 2022-04-18 css設(shè)置彈性布局讓中間內(nèi)容寬度自適應(yīng)
- 2022-02-17 npm run serve Syntax Error: Error: Node Sass versi
- 2022-09-05 卷積層計(jì)算量(FLOPS)和參數(shù)量的計(jì)算
- 2022-12-13 Prometheus?Operator架構(gòu)介紹_云其它
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支