实现C++标准库string类的简单版本
代码如下:
#ifndef STRING_H
#define STRING_H #include <cassert>
#include <utility>
#include <iostream> namespace jz
{ /************************************************************************/
/* 重新实现C风格字符串处理函数 */
/************************************************************************/ //求C风格字符串长度
size_t StrLen(const char *str)
{
assert(str != nullptr);
size_t len = ;
while (*str++ != '\0')
{
++len;
}
return len;
} //复制C风格字符串
char* StrCpy(char *dest, const char *src)
{
assert(dest != nullptr && src != nullptr);
char *temp = dest;
while ((*temp++ = *src++) != '\0');
return dest;
} //复制指定长度字符串
char* StrNCpy(char *dest, const char *src, size_t n)
{
assert(dest != nullptr && src != nullptr);
char *temp = dest;
while (n-- && (*temp++ = *src++) != '\0');
if (*temp != '\0')
{
*temp = '\0';
}
return dest;
} //拼接字符串
char* StrCat(char *dest, const char *src)
{
assert(dest != nullptr && src != nullptr);
char *temp = dest;
while (*temp != '\0')
{
++temp;
}
while ((*temp++ = *src++) != '\0');
return dest;
} //比较字符串
int StrCmp(const char *lhs, const char *rhs)
{
assert(lhs != nullptr && rhs != nullptr);
int ret = ;
while (!(ret = *lhs - *rhs) && *rhs)
{
++lhs;
++rhs;
}
if (ret > )
{
return ;
}
else if (ret < )
{
return -;
}
else
{
return ;
}
} /************************************************************************/
/* 实现标准库String类 */
/************************************************************************/
class String
{
//重载==运算符
friend bool operator==(const String &lhs, const String &rhs)
{
if (StrCmp(lhs.str, rhs.str) == )
{
return true;
}
else
{
return false;
}
} //重载!=运算符
friend bool operator!=(const String &lhs, const String &rhs)
{
return !(lhs == rhs);
} //重载+运算符
friend String operator+(const String &lhs, const String &rhs)
{
String temp;
delete[] temp.str;
temp.str = new char[lhs.Size() + rhs.Size() + ];
StrCpy(temp.str, lhs.CStr());
StrCat(temp.str, rhs.CStr());
return temp;
} //重载<<运算符
friend std::ostream& operator<<(std::ostream &os, const String &rhs)
{
os << rhs.str;
return os;
} public:
//默认构造函数
String() : str(new char[])
{
*str = '\0';
} //C风格字符串作为参数的构造函数
String(const char *cstr) : str(new char[StrLen(cstr) + ])
{
StrCpy(str, cstr);
} //拷贝构造函数(委托构造函数)
String(const String &rhs) : String(rhs.str)
{ } //拷贝赋值运算符,使用传值参数,保证异常安全并可自我赋值
String& operator=(String rhs)
{
Swap(rhs);
return *this;
} //析构函数
~String()
{
delete[] str;
} //重载+=运算符
String& operator+=(const String &rhs)
{
*this = *this + rhs;
return *this;
} //重载[]运算符
char& operator[](size_t i)
{
assert(i >= && i <= StrLen(str));
return str[i];
} //求字符串长度
size_t Size() const
{
return StrLen(str);
} //返回C风格字符串
const char* CStr() const
{
return str;
} //交换
void Swap(String &rhs)
{
std::swap(str, rhs.str);
} private:
char *str;
}; } #endif
实现C++标准库string类的简单版本的更多相关文章
- 标准库String类
下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...
- C++标准库<string>简单总结
C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...
- C++标准库异常类
C++标准库异常类 2012-12-24 16:27 5269人阅读 评论(1) 收藏 举报 分类: c/c++(36) C++标准库异常类继承层次中的根类为exception,其定义在excep ...
- C++异常第二篇---C++标准库异常类exception的使用
1 继承图示 2 具体讲解 C++标准库异常类继承层次中的根类为exception,其定义在exception头文件中,它是C++标准库所有函数抛出异常的基类,exception的接口定义如下: na ...
- 【C++ Primer每日刷】之三 标准库 string 类型
标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...
- C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...
- C++标准库string
C++标准库string 定义和初始化 string s1 默认初始化,s1是一个空串 string s2(s1) s2是s1的副本 string s2 = s1 等价于s2(s1),s2是s1的副本 ...
- c/c++ 标准库 string
c/c++ 标准库 string 标准库 string的小例子 test1~test10 #include <iostream> using namespace std; int main ...
- C 标准库 - string.h
C 标准库 - string.h This header file defines several functions to manipulate C strings and arrays. stri ...
随机推荐
- HBase1.2.0增删改查Scala代码实现
增删改查工具类 class HbaseUtils { /** * 获取管理员对象 * * @param conf 对hbase client配置一些参数 * @return 返回hbase的HBase ...
- Django Rest Framework(3)-----APIView与Viewsets
REST framework提供了一个APIView类,它是Django的View类的子类. REST framework主要的几种view以及他们之间的关系: mixins 到目前为止,我们使用的创 ...
- Python---2. 函数
转载: Py西游攻关之函数 补充: map函数和reduce函数的区别
- MapReduce的几个实现
1.倒排索引的实现 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.con ...
- Spring—spring概述
Spring框架的特点? 1:轻量级,一站式开发 2:易用,追求代码的最佳实现 3:Spring的内容: a:Ioc容器 b:AOP实现 c:数据访问支持(ORM框架/声明事务[Transaction ...
- SQL case when 多条件查询
基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后.下面给个简单示例:
- 20145307陈俊达《网络对抗》Exp3 免杀原理与实践
20145307陈俊达<网络对抗>Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测到有程序包含的 ...
- IC行业
定位IC行业,其实很简单. 我不是IC数据统计的专家,但是可以看出IC行业的发展: 在20年前,毛利是1000%,行业增长在每年20%以上 在10年前,毛利是200%,行业增长在每年10%以上 在现在 ...
- zabbix中监控某个进程的shell脚本
#!/bin/sh ret_ok= ret_warn= ret_critical= ret_unknown= info_count=`ps -aux | awk 'BEGIN {cnt=0} /[^- ...
- SpringBoot在启动时的多环境配置以及加载顺序
通常我们在开发完成一个SpringBoot项目时,总是要打包部署的. 在启动SpringBoot应用时,我们常常会使用命令java -jar xxx.jar来启动这个服务. 命令java -jar 除 ...