实现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 ...
随机推荐
- 002-原始jpa以及基本加载过程,基本sql使用
一.概述 1.1.创建 public void createMethod() { EntityManagerFactory factory = Persistence.createEntityMana ...
- Java基础方法
1:读取resource下面的文件 ClassPathResource cpr = new ClassPathResource("./MyBatisXmlFile"); File ...
- 内存记号(Memory Trail)[自定义的名字] --调试方法
即使你把输出导向到文件中,运转记录花费的时间所带来的冲击,仍然足够改变程序的执行结果.如果要改善这种情况,我必须回到一个我所谓的“Memory Trails”(内存记号)的低阶技术中.为了使用 mem ...
- cocos进阶教程(5)回调函数和定时器的使用技巧
cc.CallFunc.create(selector, data) selector:函数名(函数指针) data:参数 table类型 函数写法 function(node,args ) node ...
- hdu6158 The Designer
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6158 题目: The Designer Time Limit: 8000/4000 MS (J ...
- Python3.x:bs4解析html基础用法
Python3.x:bs4解析html基础用法 代码: import urllib.request from bs4 import BeautifulSoup import re url = r'ht ...
- Spring注解@Value
本文参考自: https://blog.csdn.net/ryelqy/article/details/77453713 @Value能让我们在java代码中使用property文件的属性,使用@Va ...
- Xcode7.2与iOS9之坑 (持续更新)
GitHub地址 前几天升级OS X EI Capitan 10.11.1, 以及Xcode7.1,正好赶上公司新产品上线,要做iOS9的适配,遇到各种坑,各种查资料,随之记录总结一下遇到的坑. 先说 ...
- MySQL的yum源
http://repo.mysql.com/ 超链接: http://repo.mysql.com/
- linux kernel 提示VFS: Cannot open root device "mmcblk0p1" or unknown-block(179,1): error -19等信息后发生panic
一.背景 文件系统安装在sd卡的第一个分区中,使用的是ext4文件系统,linux内核版本为4.14 二.思考 在内核启动之前,uboot给内核传递了参数root=/dev/mmcblk0p1,但是为 ...