C++深浅拷贝和string类的写法有哪些
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,小编给大家分享一下C++深浅拷贝和string类的写法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、深浅拷贝拷贝
千家信息网最后更新 2024年11月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安全错误
数据库的锁怎样保障安全
幻影互联网络科技工作室
浦东新区网络技术服务管理方法
我国发生的网络安全大事件
佛山app软件开发电话
如何在服务器上运行程序刷课
服务器在线查询人数
金尚互联网科技股份有限公司
网络安全十大金
辽宁安全服务器地址
成都gps时钟同步数显钟服务器
数据库系统绪论笔记
数据库倒序排列
河南省网络安全保卫总队
计算机网络技术 目录
网络安全创意画作品
网络安全大牛外国
廊坊软件开发招聘信息
宁德时代网络安全产品
minio服务器上传403错误
腾讯云什么服务器
软件定义网络技术应用论文
数据中心两套虚拟化服务器
一种数据库管理系统
网络安全教育的心得和保证
服务器人数已满
网络安全 前沿话题
飞机场代理服务器
郑州游戏啦网络技术有限公司
数据安全法与网络安全法相比
设计公司审批管控软件开发平台