代码如下:

 #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类的简单版本的更多相关文章

  1. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  2. C++标准库<string>简单总结

    C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...

  3. C++标准库异常类

    C++标准库异常类 2012-12-24 16:27 5269人阅读 评论(1) 收藏 举报  分类: c/c++(36)  C++标准库异常类继承层次中的根类为exception,其定义在excep ...

  4. C++异常第二篇---C++标准库异常类exception的使用

    1 继承图示 2 具体讲解 C++标准库异常类继承层次中的根类为exception,其定义在exception头文件中,它是C++标准库所有函数抛出异常的基类,exception的接口定义如下: na ...

  5. 【C++ Primer每日刷】之三 标准库 string 类型

    标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...

  6. C++标准库string类型

    string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...

  7. C++标准库string

    C++标准库string 定义和初始化 string s1 默认初始化,s1是一个空串 string s2(s1) s2是s1的副本 string s2 = s1 等价于s2(s1),s2是s1的副本 ...

  8. c/c++ 标准库 string

    c/c++ 标准库 string 标准库 string的小例子 test1~test10 #include <iostream> using namespace std; int main ...

  9. C 标准库 - string.h

    C 标准库 - string.h This header file defines several functions to manipulate C strings and arrays. stri ...

随机推荐

  1. 007-spring cache-缓存实现-02-springboot ehcahe3实现、springboot caffeine实现

    一.springboot ehcahe3实现步骤 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛 ...

  2. CentOS7系统上部署.net core程序

    一.准备工作 首先安装 xshell 和 xftp ,前者用于SSH连接Linux服务器,后者用于FTP上传下载文件. xshell和xftp个人使用是免费的,下载地址 之后分别输入用户名和密码登录主 ...

  3. DNS(bind)添加A、CNAME、MX、PTR记录、智能DNS(ACL)

    1.添加一条A记录(记得更改serial): vim /var/named/chroot/etc/lnh.com.zone 重启一下: rndc reload 查看从服务器: 测试结果: master ...

  4. 牛客国庆集训派对Day3 Solution

    A    Knight 留坑. B    Tree 思路:两次树形DP,但是要考虑0没有逆元 可以用前缀后缀做 #include <bits/stdc++.h> using namespa ...

  5. 前端学习笔记之JavaScript

    JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客 ...

  6. MAC nginx代理设置

    问题: 10.154.156.83:10081私服不存在了.但是不能改.用nginx代理至maven.xx.cn 增加换回地址: sudo ifconfig lo0 add 10.154.156.83 ...

  7. imx6------watchdog导致不进系统

    刚上板子,把大部分驱动都停了,不过watchdog的驱动没停,当时想没应用程序所以watchdog不用管,没想到 就是watchdog卡住了,有程序open了watchdog但是没有write,结果t ...

  8. anaconda + tensorflow +ubuntu 超级菜鸟,大家多指正【转】

    本文转载自:https://blog.csdn.net/zzw000000/article/details/51203331 1.首先安装Anaconda 下载linux对应的anaconda版本,下 ...

  9. Gym 101334F Feel Good

    http://codeforces.com/gym/101334 题意:给定一串数,求一个区间,使得该区间的所有数之和乘以该区间内最小的数的乘积最大. 思路:先预处理一下,计算出前缀和. 我们可以把每 ...

  10. python 获取进程执行的结果

    import subprocessp = subprocess.Popen([r'ls'],stdout=subprocess.PIPE) result = p.stdout.read()print( ...