網站首頁 編程語言 正文
一、無參構造函數
1.如果沒有定義構造函數,則系統自動調用此默認構造函數,且什么都不做。
2.如果用戶自定義了帶參數的構造函數,若還想調用無參的構造函數,必須顯示定義
person() { cout << "this object is being created." << endl; }
二、含參構造函數
一般構造函數可以有各種參數形式,一個類可以有多個一般構造函數,前提是參數的個數或者類型不同(基于c++的重載函數原理)
person(string ID, int age, int height, string sex) { cout<<"含參構造函數調用"<< endl; this.ID = ID; this.age = age; this.height = height; this.sex = sex; }
含參的構造函數還可以使用快速初始化的方法:
person(string ID, int age, int height, string sex) : ID(ID), age(age), height(height), sex(sex) { }
注意:
- 初始化參數列表和初始化順序不可以變動
- 變量名稱(不是參數列表名稱)一定要和成員變量名一樣
三、拷貝構造函數
使用已經創建好的同一類對象,進行構造另一個對象。
person(const person &p) { cout << "拷貝構造函數調用" << endl; this->ID = p.ID; this->age = p.age; this->height = p.height; this->sex = p.sex; }
注意:
但當類中有指針成員時,由系統默認創建該復制構造函數會存在風險,具體原因請查詢有關 “淺拷貝“
四、深拷貝和淺拷貝
淺拷貝,指的是在對象復制時,只對對象中的數據成員進行簡單的賦值,默認拷貝構造函數執行的也是淺拷貝。
例如: person p2 = p1; 這就是淺拷貝,將p1中的成員變量值賦給p2,在這里其實就相當于拷貝構造函數的調用。
但是,淺拷貝,在成員變量是引用類型(指針)時,會出現問題。
- 傳參問題中,地址傳遞后可以實現swap函數的調用,這就是淺拷貝的原理
- 當我們使用淺拷貝時,引用類型傳遞的依舊是地址,這也就是說,拷貝后的對象和拷貝的對象中引用對象指向同一塊地址,這樣就出現問題了。
在“深拷貝”的情況下,對于對象中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間。
如果一個類擁有資源,當這個類的對象發生復制過程的時候,資源重新分配,這個過程就是深拷貝。
上面提到,如果沒有自定義復制構造函數,則系統會創建默認的復制構造函數,但系統創建的默認復制構造函數只會執行“淺拷貝”,即將被拷貝對象的數據成員的值一一賦值給新創建的對象,若該類的數據成員中有指針成員,則會使得新的對象的指針所指向的地址與被拷貝對象的指針所指向的地址相同,delete該指針時則會導致兩次重復delete而出錯。
總結
原文鏈接:https://blog.csdn.net/qq_44027696/article/details/123828867
相關推薦
- 2022-03-16 Android跟隨手指移動的控件demo實例_Android
- 2022-07-12 aqs原理初探以及公平鎖和非公平鎖實現
- 2022-06-23 Python基于鏈接表實現無向圖最短路徑搜索_python
- 2022-11-12 基于Python制作一個匯率換算程序_python
- 2024-03-17 WSL子系統啟動報錯 Wsl/Service/CreateInstance/CreateVm/HCS
- 2022-11-24 PyTorch?Dataset與DataLoader使用超詳細講解_python
- 2022-09-25 linux基礎入門1 vi/vim編輯器
- 2024-02-29 UNI-APP開發之插件安裝失敗,離線安裝
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支