实现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 ...
随机推荐
- python基础之员工信息表作业
周末大礼包 文件存储格式如下: id, name, age, phone, job 1, Alex, 22, 13651054608, IT 2, Egon, 23, 13304320533, Tea ...
- enum 枚举类型默认值
enum value { one, two, three, four }; 默认值
- Django:学习笔记(8)——文件上传
Django:学习笔记(8)——文件上传 文件上传前端处理 本模块使用到的前端Ajax库为Axio,其地址为GitHub官网. 关于文件上传 上传文件就是把客户端的文件发送给服务器端. 在常见情况(不 ...
- kindle 应用程序出错,无法启动选定的应用程序,请重试。问题排查过程及处理方案。
最近一段时间在使用Kindle商城时总是会出现“应用程序出错,无法启动选定的应用程序,请重试.” 对此我花了大约一小时的时间进行测试验证并与客服人员沟通,将过程记录如下,供出现同样问题的朋友们参考. ...
- 466E - Information Graph 巧妙的判断祖先于孩子的关系
这题说的是给了一个公司员工100000 然后现在又3种操作第一种将y置为x的父亲,第二种操作将文件给第x个人签他签完给他的上司签,一直到没有上司为止,第三种操作问x是否签了第i份文件,然后 我们只要直 ...
- extern--C#调用C++等其他非托管代码
例如: https://www.cnblogs.com/sosoft/p/extern.html
- bzoj1606 / P2925 [USACO08DEC]干草出售Hay For Sale(01背包)
P2925 [USACO08DEC]干草出售Hay For Sale 简化版01背包(连价值都免了) 直接逆推解决 #include<iostream> #include<cstdi ...
- foo、bar美国版的张三李四
不管看javascript还是其他语言举例,经常看到使用foo和bar来充当变量.那么究竟foo.bar是什么鬼? 一说:foo 和 bar 组合在一起所构成的 foobar 应该最能反映其原始的意思 ...
- Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- co ...
- CSS3 页面中展示邮箱列表点击弹出发送邮件界面
CSS3 页面中展示邮箱列表点击弹出发送邮件界面 代码: <!DOCTYPE html> <html> <head> <meta charset=" ...