首页 > 其他分享 >21String类的实现

21String类的实现

时间:2024-01-20 23:35:24浏览次数:28  
标签:pstr const String 实现 s2 s1 21String ._

String类的实现

//#include<string>
#include<iostream>

using namespace std;

class String
{
private:
	char* _pstr;
	friend String operator+(const String& s1, const String& s2);
	friend ostream& operator<<(ostream& out, const String& str);
public:
	String(const char* p = nullptr)
	{
		if (p != nullptr)
		{
			_pstr = new char[strlen(p) + 1];
			strcpy(_pstr, p);
		}
		else
		{
			_pstr = new char('\0');
		}
	}
	~String()
	{
		delete[]_pstr;
		_pstr = nullptr;
	}
	String(const String& s)
	{
		_pstr = new char[strlen(s._pstr) + 1];
		strcpy(_pstr, s._pstr);
	}
	String & operator=(const String &src)
	{
		if (&src == this)
		{
			return *this;
		}
		delete[]_pstr;
		_pstr = new char[strlen(src._pstr) + 1];
		strcpy(_pstr, src._pstr);
		return *this;
	}
	char& operator[](int i) //可以作为左值,被修改
	{
		return _pstr[i];
	}
	const char& operator[](int i) const //常方法,String不可被修改
	{
		return _pstr[i];
	}
	bool operator>(const String& s)const
	{
		return strcmp(this->_pstr, s._pstr) > 0;
	}
	bool operator<(const String& s)const
	{
		return strcmp(this->_pstr, s._pstr) < 0;
	}
	bool operator==(const String& s)const
	{
		return strcmp(this->_pstr, s._pstr) == 0;
	}
	int length()const
	{
		return strlen(_pstr);
	}
};

String operator+(const String& s1, const String& s2)
{
	//为了避免内存泄漏,先构造一个String对象,再释放_s的空间,返回String对象
	char* _s = new char[strlen(s1._pstr) + strlen(s2._pstr) + 1];
	strcpy(_s, s1._pstr);
	strcat(_s, s2._pstr);
	String s(_s);
	delete[]_s;
	return s;
}
ostream& operator<<(ostream& out, const String& str)
{
	out << str._pstr;
	return out;
}

int main()
{
	String s1 = "aaa";
	String s2 = "bbb";
	String s3 = s1 + s2;
	cout << s3 << endl;
	cout << (s2 > s1) << endl;
	cout << s1.length() << endl;
	for (int i = 0; i < s1.length(); i++)
	{
		cout << s1[i] << " ";
		s1[i] = s2[i];
	}
	cout << s1;
}

下述代码中,为了返回两字符串相连的结果,_s和s内部的调用分别做了一次new和delete,同时return时s做了一次拷贝构造,代价较高。

String operator+(const String& s1, const String& s2)
{
	//为了避免内存泄漏,先构造一个String对象,再释放_s的空间,返回String对象
	char* _s = new char[strlen(s1._pstr) + strlen(s2._pstr) + 1];
	strcpy(_s, s1._pstr);
	strcat(_s, s2._pstr);
	String s(_s);
	delete[]_s;
	return s;
}

一种更优解法

String operator+(const String& s1, const String& s2)
{
	//减少了一次new和一次delete
	String tmp;
	tmp._pstr = new char[strlen(s1._pstr) + strlen(s2._pstr) + 1];
	strcpy(tmp._pstr, s1._pstr);
	strcat(tmp._pstr, s2._pstr);
	return tmp;
}

标签:pstr,const,String,实现,s2,s1,21String,._
From: https://www.cnblogs.com/sio2zyh/p/17977360

相关文章

  • 22String字符串和vector对象的迭代器iterator实现
    String字符串对象的迭代器iterator实现泛型算法参数接收的都是迭代器泛型算法是一组全局的函数,适用于所有容器基于第二点,泛型算法有一套方法可以统一地遍历所有容器的元素classString{public: //嵌套定义iterator类 classiterator { private: char*_p;//没有用......
  • 认识智能合约&线上 IDE实现Solidity 合约
    实验五:认识智能合约&线上IDE实现Solidity合约实验概述本实验参考自以太坊中的以太猫游戏和LoomNetwork团队的智能合约教学案例,进行Solidity智能合约入门与remix在线IDE使用练习,通过构建一个“宠物游戏”来学习智能合约的编写,在实验中穿插Solidity基础知识。实验......
  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    LeetCode232.用栈实现队列题目链接:232.用栈实现队列思路:用两个栈实现队列 LeetCode  225.用队列实现栈 题目链接:225.用队列实现栈 思路:一个队列对栈进行实现(实现栈中的方法) ......
  • 面试官:SpringBoot如何实现缓存预热?
    缓存预热是指在SpringBoot项目启动时,预先将数据加载到缓存系统(如Redis)中的一种机制。那么问题来了,在SpringBoot项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢?实现方案概述在SpringBoot启动之后,可以通过以下手段实现缓存预热:使用启动监听事件实现缓存预热。使......
  • shiro实现用户踢出,在线用户列表展示功能,包含常见踩坑集合、代码下载
    功能描述:用户a登录了s账号,接着用户b也登录了s账号,此时用户a将被踢出。一个账号只能一个人登录,被别人登录了,那么你就要被踢下线。本文目录shiro认证与授权理解实现需求核心以下是实现shiro用户踢出KickOutListener(登录成功后加入业务逻辑)kickOutFilter(进入controller的初级验证)配置......
  • 利用aop、拦截器HandlerInterceptor来实现接口限流,日志收集
    前言:aop是面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。拦截器是web请求中一个请求周期中的一环就实现接口限流这个需求来说,用aop和HandlerInterceptor都可以来实现,就是在调用接口之前做一些约束而已。aop+自定义注解+Semaphore实现接口限流自......
  • springboot整合springSecurity入门案例(实现登录,记住我等常用标签使用)
    一,整合进依赖每个依赖都标了注释,大家可以按照自己需要的来添加,置于配置问件啥的,大家可以参考springboot+mybatisplus+redis整合(附上脚手架完整代码)<!--主要就是加了这个依赖--><dependency><groupId>org.springframework.security</groupId><artifact......
  • sringboot整合shiro实现前后端鉴权控制,标签注解速成(包含常见错误的出现,前后端注解标签
    搭建shiro环境1:导入boot项目中要用到的shiro依赖<!--shiro部分--><!--shiro核心源码--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version......
  • springboot项目结合filter,jdk代理实现敏感词过滤(简单版)
    我们对getParameter()这个方法得到的参数进行敏感词过滤。实现思路:利用过滤器拦截所有的路径请求同时在在过滤器执行的时候对getParameter得到的value值进行过滤。最后呢,到我们自己的实现的逻辑中呢?这个value值就被我们做过处理了。1:自定义的过滤配置文件把文件位置放在resource下的......
  • 利用aop实现热拔插(类似于插件)
    现在有这么一个需求:就是我们日志的开与关是交给使用人员来控制的,而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理,但是如何动态的来实现日志管理呢?aop源码中的实现逻辑中有这么一个步骤,就是会依次扫描Advice的实现类,然后执行。我们要做的就是自定义一个advice的......