C++深浅拷贝和string类的写法有哪些
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,小编给大家分享一下C++深浅拷贝和string类的写法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、深浅拷贝拷贝
千家信息网最后更新 2025年01月20日C++深浅拷贝和string类的写法有哪些
小编给大家分享一下C++深浅拷贝和string类的写法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
一、深浅拷贝
拷贝这个词对于我们来说应该不陌生,比如我们平常的复制和粘贴就是拷贝;但是如果把拷贝这个词放到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; };}
以上是"C++深浅拷贝和string类的写法有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
拷贝
函数
写法
C++
空间
深浅
就是
内容
篇文章
代码
传统
字符
字符串
还是
分析
不行
复杂
平常
陌生
不怎么
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
sql学生信息数据库下载
plsql登数据库快捷键
国家小学生网络安全
dell服务器ipmi
互联网时代出现了什么什么的科技
闽盾杯网络安全攻防大赛题库
阿里云服务器 配置
羿龙(北京)网络技术
软件开发的主流技术
网络安全治理小组
西安软件开发公司永宁门
车帮主rpc服务器不可用
外汇模拟交易软件开发
qq服务器在哪
怎样快速选中全部数据库
锐点数据库
数目数据库英文简写
深圳erp软件开发价格
2021 h3c服务器占有率
计算机网络技术与应用百度云
搜道网络技术
青藤云网络安全
天下3等级服务器
滁州电力软件开发外包公司
线上软件开发多少钱
网络安全研讨会
网络安全知识教育图片
为什么数据库需要定义事务
hntd 网络技术与设备
对计算机网络技术有什么了解