網站首頁 編程語言 正文
類中有指針成員 才會討論 淺拷貝 和深拷貝問題。
淺拷貝(單純值拷貝)
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
char *m_name;
public:
Person(char *name)
{
cout<<"有參構造"<<endl;
m_name = (char *)calloc(1,strlen(name)+1);
if(m_name == NULL)
{
cout<<"空間申請失敗"<<endl;
exit(-1);
}
strcpy(m_name, name);
}
~Person()
{
cout<<"析構函數"<<endl;
//釋放指針成員 指向的堆區空間
if(m_name != NULL)
{
free(m_name);
m_name = NULL;
}
cout<<"-----001------"<<endl;
}
};
int main(int argc, char *argv[])
{
Person ob1("lucy");
Person ob2 = ob1;//拷貝構造(默認是淺拷貝)
cout<<"ob2.m_name = "<<ob2.m_name<<endl;
return 0;
}
深拷貝
必須在拷貝構造中給ob2.m_name申請空間
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
char *m_name;
public:
Person(char *name)
{
cout<<"有參構造"<<endl;
m_name = (char *)calloc(1,strlen(name)+1);
if(m_name == NULL)
{
cout<<"空間申請失敗"<<endl;
exit(-1);
}
strcpy(m_name, name);
}
Person(const Person &ob)
{
cout<<"拷貝構造函數(深拷貝)"<<endl;
m_name = (char *)calloc(1, strlen(ob.m_name)+1);
if(m_name == NULL)
{
cout<<"空間申請失敗"<<endl;
exit(-1);
}
strcpy(m_name, ob.m_name);
}
~Person()
{
cout<<"析構函數"<<endl;
//釋放指針成員 指向的堆區空間
if(m_name != NULL)
{
free(m_name);
m_name = NULL;
}
}
};
int main(int argc, char *argv[])
{
Person ob1("lucy");
Person ob2 = ob1;//拷貝構造
cout<<"ob2.m_name = "<<ob2.m_name<<endl;
return 0;
}
總結
1、如果類中的成員 指向了堆區空間 一定要記得在析構函數中 釋放該空間
2、如果用戶 不實現 拷貝構造 系統就會提供默認拷貝構造,而默認拷貝構造 只是單純的賦值 容易造成淺拷貝問題
3、用戶記得 要實現:無參構造(初始化數據)、有參構造(賦參數)、拷貝構造(深拷貝) 、析構函數(釋放空間)
拷貝構造函數的調用時機
拷貝構造函數調用的時機:舊對象 給新對象 初始化
class Data
{
public:
Data()
{
cout<<"無參構造"<<endl;
}
Data(const Data &ob)
{
cout<<"拷貝構造"<<endl;
}
~Data()
{
cout<<"析夠函數"<<endl;
}
};
情形1:舊對象給新對象初始化
Data ob1;
Data ob2 = ob1;//調用拷貝構造
情形2:普通對象作為函數的參數
void fun01(Data ob)//Data ob=ob1 發生拷貝構造
{
}
int main(int argc, char *argv[])
{
Data ob1;
fun01(ob1);
return 0;
}
情形3:普通對象 作為函數的返回值
#include <iostream>
using namespace std;
Data fun01(void)
{
Data ob1;
return ob1;
}
int main(int argc, char *argv[])
{
Data ob = fun01();
return 0;
}
vs下會發生拷貝構造:
Qt、linux不會發生拷貝:
原文鏈接:https://blog.csdn.net/qq_34981463/article/details/124994749
相關推薦
- 2022-09-25 Dynamic-DataSource多數據源配置mybatis/mybatis-plus
- 2022-12-04 Android多功能視頻播放器GSYVideoPlayer開發流程_Android
- 2023-01-15 GoLang內存泄漏原因排查詳解_Golang
- 2022-12-07 C語言如何求整數的位數及各位數字之和_C 語言
- 2022-09-15 python安裝whl文件的實戰步驟_python
- 2022-12-29 正則表達式匹配ip地址超詳細講解_正則表達式
- 2022-08-18 YOLOv5改進教程之添加注意力機制_python
- 2022-03-07 深入淺析C/C++語言結構體指針的使用注意事項_C 語言
- 最近更新
-
- 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同步修改后的遠程分支