当前位置: 首页 > news >正文

网站建设背景文字品牌推广营销平台

网站建设背景文字,品牌推广营销平台,做网站是java还是php,网站app开发⭐本篇重点:string类的模拟,自己实现一个简单的string类 ⭐本篇代码:c学习/05.string类的学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. 经典string类的模拟 1.1 深浅拷贝问题 1.2 使用深拷贝完成经典string类的…

⭐本篇重点:string类的模拟,自己实现一个简单的string类

⭐本篇代码:c++学习/05.string类的学习 · 橘子真甜/c++-learning-of-yzc - 码云 - 开源中国 (gitee.com)

目录

一. 经典string类的模拟

1.1 深浅拷贝问题

 1.2 使用深拷贝完成经典string类的模拟

a size函数

b 拷贝构造函数

 c 赋值运算符重载

d operator[]重载

二. 现代写法的string类模拟

2.1 拷贝构造函数

 2.2 赋值运算符重载

三. 下篇文章:STL中vector的使用 


一. 经典string类的模拟

        实现一个简单的string类,主要是实现string类的构造函数,析构函数,拷贝构造函数,赋值运算符重载。这个过程需要我们首先理解深浅拷贝的问题。

1.1 深浅拷贝问题

        浅拷贝问题:如果我们初始化一个对象的时候,只是简单的将另一个对象的值赋值给这个对象。比如我们在堆上申请的空间。当我们销毁这两个对象的时候,由于它们指向同一个空间,这个空间就会被销毁两次。程序就会崩溃

测试代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
using namespace std;namespace yzc
{class string{public:string(const char* str = ""):_str(new char[strlen(str) + 1]){cout << "调用构造函数" << endl;strcpy(_str, str);}//拷贝构造string(const string& str){*this = str;}~string(){cout << "调用析构函数" << endl;delete[] _str;}void print(){cout << _str << endl;}private:char* _str;};
}int main()
{yzc::string s1 = "123456";yzc::string s2 = "abcdef";s1.print();s2.print();return 0;
}

没有调用拷贝构造函数,可以正常输出。

运行结果如下:

如果我们使用拷贝构造函数

int main()
{yzc::string s1 = "123456";yzc::string s2(s1);return 0;
}

分析代码可知,由于浅拷贝问题。输出一次调用构造函数和两次析构函数后程序崩溃

只有使用深拷贝,我们在拷贝构造函数里面重新申请一份空间,然后重新全部复制才行。 

 1.2 使用深拷贝完成经典string类的模拟

a size函数

        为了完成深拷贝,我们需要定义一个size函数用于求_str的长度。加上const,因为函数内部并不会更改任何值

		int size()const{return strlen(_str);}

b 拷贝构造函数

与构造函数类似,我们重新开辟一份空间,然后使用strcpy进行拷贝

​//拷贝构造,使用深拷贝完成拷贝string(const string& s):_str(new char[s.size()]){strcpy(_str, s._str);}

测试代码: 

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
using namespace std;namespace yzc
{class string{public:string(const char* str = ""):_str(new char[strlen(str) + 1])	//由于C语言字符串后面都带'\0',需要加上1{strcpy(_str, str);}拷贝构造//string(const string& str)//{//	*this = str;//}//拷贝构造,使用深拷贝完成拷贝string(const string& s):_str(new char[s.size() + 1])    //一定要注意要加1,否则会越界访问{strcpy(_str, s._str);}~string(){delete[] _str;_str = nullptr;}int size()const{return strlen(_str);}void print(){cout << _str << endl;}private:char* _str;};
}int main()
{yzc::string s1 = "123456";yzc::string s2(s1);s1.print();s2.print();return 0;
}

测试结果 

 c 赋值运算符重载

与拷贝构造函数一样,要注意深浅拷贝的问题

		//赋值运算符重载string& operator=(const string& s){if (this != &s)//地址不同才进行赋值{delete[] _str; //释放原地址空间,防止内存泄漏//定义中间变量tmp用于拷贝char* tmp = new char[s.size() + 1]; //注意要 + 1strcpy(tmp, s._str);_str = tmp;}return *this; //返回当前对象,为了支持 a = b = c}

 测试:主函数代码如下

int main()
{yzc::string s1 = "123456";yzc::string s2 = "abcdef";yzc::string s3 = s1;yzc::string s4;s4 = s2;s3.print();s4.print();return 0;
}

测试结果:

d operator[]重载

我们还能重载[]这个操作符,方便我们遍历整个字符串

直接输入i,返回_str[i]即可(注意const) 

		char& operator[](size_t i){assert(i < size());return _str[i];}const char& operator[](size_t i)const{assert(i < size());return _str[i];}

测试代码:

int main()
{yzc::string s1 = "159753468244";for (int i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;return 0;
}

运行结果:

二. 现代写法的string类模拟

2.1 拷贝构造函数

         为了提高代码的复用,我们在拷贝构造函数中使用构造函数去构造一个对象,然后交换当前对象和这个对象。

代码如下:

		//现代版写法string(const string& s):_str(nullptr){string strTmp(s._str); //使用构造函数将s._str构造一个tmpswap(_str, strTmp._str);//交换_str和tmp}

交换后,strTmp由于是局部变量就直接被销毁了! 而我们创建的对象被保留

 2.2 赋值运算符重载

我们使用传值方法传参,交换_str后我们成功创建的对象。且不会影响传入的对象

//现代版写法string& operator=(string s) //不使用引用传参,而是传值{swap(_str, s._str);return *this;}

测试代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <assert.h>
using namespace std;namespace yzc
{class string{public:string(const char* str = ""):_str(new char[strlen(str) + 1])	//由于C语言字符串后面都带'\0',需要加上1{strcpy(_str, str);}拷贝构造,使用深拷贝完成拷贝//string(const string& s)//	:_str(new char[s.size() + 1]) //注意要加1//{//	strcpy(_str, s._str);//}//现代版写法string(const string& s):_str(nullptr){string strTmp(s._str); //使用构造函数将s._str构造一个tmpswap(_str, strTmp._str);//交换_str和tmp}赋值运算符重载//string& operator=(const string& s)//{//	if (this != &s)//地址不同才进行赋值//	{//		delete[] _str; //释放原地址空间,防止内存泄漏//		//定义中间变量tmp用于拷贝//		char* tmp = new char[s.size() + 1];//		strcpy(tmp, s._str);//		_str = tmp;//		//	}//	return *this; //返回当前对象,为了支持 a = b = c//}//现代版写法string& operator=(string s) //不使用引用传参,而是传值{swap(_str, s._str);return *this;}~string(){delete[] _str;_str = nullptr;}size_t size()const{return strlen(_str);}void print(){cout << _str << endl;}private:char* _str;};
}int main()
{yzc::string s1 = "123456";yzc::string s2(s1);yzc::string s3 = s1;s1.print();s2.print();s3.print();return 0;
}

运行结果:

三. 下篇文章:STL中vector的使用 

http://www.hkea.cn/news/754831/

相关文章:

  • 泰安诚信的网站建设b站推广入口2023年
  • 高校网站建设资料库东莞seo推广公司
  • 电子印章手机在线制作软件四川seo整站优化费用
  • 个人风采网站制作外贸网站平台哪个好
  • 沈阳企业建站谷歌推广和seo
  • .la域名做的网站如何快速推广app
  • 广州优化网站建设怎么用手机制作网站
  • 做微网站的第三方学网络营销
  • 湖南做网站的公司有哪些搜索引擎是什么
  • flash网站管理系统seo优化排名易下拉用法
  • 永年网站建设友链互换平台推荐
  • 企业网站的设计公司网络广告营销的典型案例
  • 高校思政主题网站建设的意义关键词歌词任然
  • 哪里做网站比较快2345网址导航下载桌面
  • 广州建设委员会官方网站凡科建站下载
  • 全球做网站的公司排名百度一下你就知道官网
  • 小企业网站价格免费发链接的网站
  • 买了空间和域名 怎么做网站哪家公司网站做得好
  • 网站备案是否关闭衡阳网站建设公司
  • 遂昌建设局网站个人怎么做网站
  • 软件开发和网站建设网络营销的未来6个发展趋势
  • 做网站一年多少钱免费seo网站推广
  • 智通人才网东莞最新招聘信息官网seo是如何做优化的
  • 个人做跨境电商网站百度地图导航手机版免费下载
  • 阿里云注册网站之后怎么做网站百度联盟是什么
  • 动画制作视频河南网站排名优化
  • 网站关键词怎么做排名掌门一对一辅导官网
  • 现在什么网站做推广比较好网页设计需要学什么
  • 个人购物网站 怎么建网络营销包括
  • 有没有做鸭的网站工作室招聘广州网站优化工具