摘要

实现了一个string类,包括基本的构造、赋值、判断、大小写等。

String API

Constructors

string();
string(const char& ch);
string(const char* str);
string(const string& str);

Informational Methods

unsigned Length() const;
int Index(char c) const;

Case Methods

void UpCase(unsigned first, unsigned last);
void LowCase(unsigned first, unsigned last);

Stream Operators

friend std::ostream& operator<<(std::ostream& os, const string& str);
friend std::istream& operator>>(std::istream& is, string& str);

Accessor Operators

const char& operator[](unsigned i) const;
char& operator[](unsigned i);

Assignment Operators

String&  operator= (const String&)
String& operator+= (const String&)

String Concatenation

friend string operator+(const string& lhs, const string& rhs);
friend string operator+(const string& lhs, const char* rhs);
friend string operator+(const char* lhs, const string& rhs);

Logical Operators

friend bool operator==(const string& lhs, const string& rhs);
friend bool operator!=(const string& lhs, const string& rhs);
friend bool operator<(const string& lhs, const string& rhs);
friend bool operator>(const string& lhs, const string& rhs);
#include "string.h"

using namespace vlyf;

inline
vlyf::string::string()
{
length = 0;
data = new char[0];
} inline
string::string(const char* str)
{
if (str)
{
unsigned n = 0;
while (str[n] != '\0') n++;
data = new char[n];
length = n;
for (unsigned i = 0; i < n; i++)
{
data[i] = str[i];
}
}
else
{
length = 0;
data = new char[0];
}
} inline
string::string(const string& str)
{
unsigned len = str.Length();
length = len;
data = new char[len];
for (unsigned i = 0; i < len; i++)
{
data[i] = str[i];
}
} inline
string::~string()
{
delete[]data;
} inline
unsigned string::Length() const
{
return length;
} int string::Index(char c) const
{
for (unsigned i = 0; i < Length(); i++)
{
if (c == data[i]) return i;
}
return -1;
} inline
void string::UpCase(unsigned first, unsigned last)
{
while (first++ < last)
{
if ('a' <= data[first] && data[first] <= 'z')
data[first] -= ('a' - 'A');
}
} inline
void string::LowCase(unsigned first, unsigned last)
{
while (first++ < last)
{
if ('A' <= data[first] && data[first] <= 'Z')
data[first] += ('a' - 'A');
}
} const char& vlyf::string::operator[](unsigned i) const
{
return data[i];
} char& vlyf::string::operator[](unsigned i)
{
return data[i];
} string& vlyf::string::operator=(const char* s)
{
char* temp = data; //保存原本数据,确保异常安全性
unsigned n = 0;
while (s[n] != '\0')
n++;
length = n;
data = new char[n];
for (unsigned i = 0; i < n; i++)
data[i] = s[i];
delete[] temp;
return *this;
} inline
string& vlyf::string::operator=(const string& str)
{
if (this == &str) return *this;
char* temp = str.data; //保存原本数据,确保异常安全性 unsigned len = str.Length();
data = new char[len];
for (unsigned i = 0; i < len; i++)
data[i] = str[i];
length = len;
delete[] temp;
return *this;
} inline
string& string::operator+=(const string& str)
{
unsigned len = length + str.Length();
char* ss = new char[len];
for (unsigned i = 0; i < Length(); i++)
ss[i] = data[i];
for (unsigned i = 0; i < str.Length(); i++)
ss[i + length] = str[i];
delete[]data;
data = ss;
length = len;
return *this;
} std::ostream& vlyf::operator<<(std::ostream& os, const string& str)
{
if (str.Length() > 0)
{
for (unsigned i = 0; i < str.Length(); i++)
os << str[i];
}
else
{
os << "";
}
return os;
} std::istream& vlyf::operator>>(std::istream& is,string& str)
{
char* ss = new char[1000];
is >> ss;
str = string(ss);
return is;
} string vlyf::operator+(const string& lhs, const string& rhs)
{
return string(lhs) += rhs;
} string vlyf::operator+(const string& lhs, const char* rhs)
{
return string(lhs) += string(rhs);
} string vlyf::operator+(const char* lhs, const string& rhs)
{
return string(lhs) += string(rhs);
} bool vlyf::operator==(const string& lhs, const string& rhs)
{
if (lhs.Length() != rhs.Length())
return false;
unsigned n = 0;
unsigned len = lhs.Length();
while (lhs[n] == rhs[n] && len != n)
n++;
return n == len;
} bool vlyf::operator!=(const string& lhs, const string& rhs)
{
if (lhs.Length() != rhs.Length())
return true;
unsigned n = 0;
unsigned len = lhs.Length();
while (lhs[n] == rhs[n] && len != n)
n++;
return n != len;
} bool vlyf::operator<(const string& lhs, const string& rhs)
{
unsigned min = (lhs.Length() < rhs.Length()) ? lhs.Length() : rhs.Length();
unsigned n = 0;
while (lhs[n] == rhs[n] && n != min)
n++;
if (n == min) return lhs.Length() < rhs.Length();
else
{
if (lhs[n] < rhs[n])
return lhs.Length() < rhs.Length();
else
return lhs.Length() > rhs.Length();
}
} bool vlyf::operator>(const string& lhs, const string& rhs)
{
return lhs < rhs;
} int main()
{
string s1 = "123";
std::cout << "s1:" << s1 << " length: " << s1.Length() << std::endl; string s2("456");
std::cout << "s2:" << s2 << " length: " << s2.Length() << std::endl; string s3(s1);
std::cout << "s3:" << s3 << " length: " << s3.Length() << std::endl; string s4 = s3;
std::cout << "s4:" << s4 << " length: " << s4.Length() << std::endl; string s5(s1);
s5 += s2;
std::cout << "s5:" << s5 << " length: " << s5.Length() << std::endl; string s6(s5);
std::cout << "s6:" << s6 << " length: " << s6.Length() << std::endl; if (s5 == s6) std::cout << "s5 == s6: true" << std::endl; string s7 = s1 + "456";
std::cout << "s7:" << s7 << " length: " << s7.Length() << std::endl; string s8 = "456" + s1;
std::cout << "s8:" << s8 << " length: " << s8.Length() << std::endl; string s9 = s7 + s8;
std::cout << "s9:" << s9 << " length: " << s9.Length() << std::endl; return 0;
}

实现简单的string类的更多相关文章

  1. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  2. 一个简单的string类,读书看报系列(一)

    对于这个类,写过程序的都知道应该含有的方法是 初始化.销毁.拼接.求长度.清除.判断是否为空等.还有一些操作符重载 一.先看初始化: 可以想到应该有默认构造的的.带有字符串的.带有默认字符的.还有一个 ...

  3. 【c++】简单的string类的几个基本函数

    // string的几个基本函数的实现 #include <iostream> #include <assert.h> #include <string.h> us ...

  4. 【Java】整理关于java的String类,equals函数和比较操作符的区别

    初学 Java 有段时间了,感觉似乎开始入了门,有了点儿感觉但是发现很多困惑和疑问而且均来自于最基础的知识折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟大家先来看看一段奇怪的程 ...

  5. c++在string类源

    一:回想 (1)c++中的string类是在面试中和笔试中常常考的题目: project代码免费下载 string类的自行实现 (2)c++中的string类和fstream类合起来是处理外部数据的利 ...

  6. 全面深入介绍C++字符串:string类

    http://blog.csdn.net/liuliming3000/article/details/1809385 1 从C到C++ string类 2 string类的构造函数 3 string类 ...

  7. C++标准模板库Stand Template Library(STL)简介与STL string类

    参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...

  8. C++ char数组和string类简单使用总结

    使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...

  9. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...

随机推荐

  1. git crate patch and check&apply patch(八)

    root@vmuer-VirtualBox:/opt/myProject# git format-patch master0001-add-c.c.patch root@vmuer-VirtualBo ...

  2. PHP Record the number of login users

    Function to record how many times the user logs in Connect to the database first: you can create a n ...

  3. Python逆向(二)—— pyc文件结构分析

    一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与反 ...

  4. 第08组 Alpha冲刺(6/6)

    队名:955 组长博客:https://www.cnblogs.com/cclong/p/11913269.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...

  5. tomcat 启动中文乱码

        1.情景展示 从Apache官网下载的tomcat,启动后中文日志信息显示乱码. 启动startup.bat后 2.原因分析 通过修改日志输出的字符集来解决. 3.解决方案 tomcat安装目 ...

  6. win10重装win7 无法引导

    品牌机win10回滚win7 无法引导 BIOS设置 按键盘上的右方向键(→)选择到"Exit" 按键盘上的下方向键(↓)选择到 "OS Optimized Defaul ...

  7. 《京东B2B业务架构演变》阅读笔记

    一.京东 B2B 业务的定位 让各类型的企业都可以在京东的 B 平台上进行采购.建立采购关系. 京东 B2B 的用户群体主要分为 2 类: 一类是大 B 用户.另一类是小 B 用户.京东 B 平台需要 ...

  8. CAP原则 (阿里)

    CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance).CAP 原则指的是,这三 ...

  9. cv2 的用法

    转载:https://www.cnblogs.com/shizhengwen/p/8719062.html 一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 fi ...

  10. FileInputFormat 的实现之TextInputFormat

    说明 TextInputFormat默认是按行切分记录record,本篇在于理解,对于同一条记录record,如果被切分在不同的split时是怎么处理的.首先getSplits是在逻辑上划分,并没有物 ...