網站首頁 編程語言 正文
一、深淺拷貝
拷貝這個詞對于我們來說應該不陌生,比如我們平常的復制和粘貼就是拷貝;但是如果把拷貝這個詞放到C++中來說就有一些復雜了,我們先來看一下什么是淺拷貝:
下面用字符串類來模擬實現。
class Astring { public: //構造函數 Astring(const char* str = "") { _str = new char[strlen(str) + 1]; strcpy(_str, str); } //采用淺拷貝寫的構造函數 Astring(const Astring& s) { _str = s._str; } //析構函數 ~Astring() { delete[] _str; _str = nullptr; } private: char* _str; }; int main() { Astring aa("hello C++"); Astring bb(aa); //這里調用拷貝構造 return 0; }
當我們執行以上程序的話就會失敗,結果如下:
分析如下圖所示:
所以我們采用淺拷貝使用同一塊空間是不行了,那么怎么辦呢?當然是重新開一塊和別人同樣大小的空間,然后再把別人空間里面的內容給拷貝過來,而這樣就是所謂的深拷貝了;我們還是用字符串類來模擬實現深拷貝:
class Astring { public: //構造函數 Astring(const char* str = "") { _str = new char[strlen(str) + 1]; strcpy(_str, str); } //采用深拷貝寫的構造函數 Astring(const Astring& s) { _str = new char[strlen(s._str) + 1]; strcpy(_str, s._str); } //析構函數 ~Astring() { delete[] _str; _str = nullptr; } private: char* _str; }; int main() { Astring aa("hello C++"); Astring bb(aa); return 0; }
分析如下圖所示:
二、string類的兩種寫法
有了上面我們知道的深淺拷貝,所以我們明白類中的拷貝構造函數和賦值重載一定要用深拷貝來實現,不過拷貝構造函數和賦值重載還是有兩種寫法的。
1. 傳統寫法
傳統寫法就是要自己開辟空間自己來拷貝別人的東西,什么事情都要自己干,代碼如下:
//搞一個命名空間,里面實現自己寫的string類 namespace cjy { class string { public: //構造函數 string(const char* str = "") :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } //拷貝構造函數 string(string& s) :_str(new char[strlen(s._str) + 1]) { strcpy(_str, s._str); } //賦值重載,s1=s3 string& operator=(const string& s) { if (this != &s) { char* tmp = new char[strlen(s._str) + 1]; delete[] _str; _str = tmp; strcpy(_str, s._str); } return *this; } //析構函數 ~string() { delete[] _str; _str = nullptr; } private: char* _str; }; }
2. 現代寫法
現代寫法就是復用其它的函數,自己不用干活,交給其它函數來幫你實現,代碼如下:
//現代寫法:拷貝構造、賦值重載函數 namespace cjy { class string { public: //構造函數 string(const char* str = "") { _str = new char[strlen(str) + 1]; strcpy(_str, str); } //拷貝構造函數 string(const string& s) :_str(nullptr) { string tmp(s._str); std::swap(_str, tmp._str); } //賦值重載 string& operator=(string s) { std::swap(_str, s._str); return *this; } private: char* _str; }; }
分析如下圖所示:
總結
原文鏈接:https://blog.csdn.net/m0_56311933/article/details/123371239
- 上一篇:C語言的數組指針與函數指針詳解_C 語言
- 下一篇:在pycharm中設置快速創建
相關推薦
- 2023-03-25 Excel?VBA指定條件刪除整行整列的實現_vbs
- 2022-10-07 C#如何實現調取釘釘考勤接口的功能_C#教程
- 2022-05-10 .NET實現異步編程async和await_實用技巧
- 2022-11-23 Python?threading模塊中lock與Rlock的使用詳細講解_python
- 2023-08-13 微信小程序底部導航欄最多只能顯示五個,解決辦法
- 2022-08-06 python?sns.countplot()?繪畫條形圖詳情_python
- 2022-05-27 Flutter狀態管理Bloc之定時器示例_Android
- 2022-07-04 Python如何一行輸入多個數,并存入列表_python
- 最近更新
-
- 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同步修改后的遠程分支