一个简单实现的string类
Posted huangwenhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单实现的string类相关的知识,希望对你有一定的参考价值。
为了复习c++知识,简单的实现一个string类,类名为CMyString
环境说明:windows 7 64位
开发工具:Visual Studio 2015
CMyString类的头文件CMyString.h
1 #include <iostream> 2 3 #ifndef __C_MY_STRING__ 4 #define __C_MY_STRING__ 5 6 class CMyString 7 8 public: 9 //默认构造函数 10 CMyString(); 11 //带参数的构造函数 12 CMyString(const char* str); 13 //拷贝构造函数 14 CMyString(const CMyString&); 15 //析构函数 16 ~CMyString(); 17 18 //重载赋值运算符 19 CMyString& operator=(const CMyString&); 20 CMyString& operator=(const char*); 21 //重载[]运算符(可修改) 22 char& operator[](const int); 23 //重载[]运算符(不可修改) 24 const char& operator[](const int) const; 25 //重载==运算符 26 bool operator==(const CMyString&) const; 27 //重载!=运算符 28 bool operator!=(const CMyString&) const; 29 //重载>运算符 30 bool operator>(const CMyString&) const; 31 //重载<运算符 32 bool operator<(const CMyString&) const; 33 //重载>=运算符 34 bool operator>=(const CMyString&) const; 35 //重载>=运算符 36 bool operator<=(const CMyString&) const; 37 //重载<<运算符 38 friend std::ostream& operator<<(std::ostream&, const CMyString &); 39 private: 40 char* m_pdata; 41 ; 42 43 #endif // !__C_MY_STRING__
CMyString类的实现文件CMyString.cpp
1 #include "CMyString.h" 2 3 CMyString::CMyString() 4 5 //创建一个空的data,占一个字节空间 6 m_pdata = new char[1]; 7 m_pdata[0] = ‘\\0‘; 8 9 10 CMyString::CMyString(const char * str) 11 12 if (str) 13 14 int len = std::strlen(str); 15 m_pdata = new char[len+1]; 16 std::strncpy(m_pdata, str, len); 17 m_pdata[len] = ‘\\0‘; 18 19 else 20 21 //创建一个空的data,占一个字节空间 22 m_pdata = new char[1]; 23 m_pdata[0] = ‘\\0‘; 24 25 26 27 CMyString::CMyString(const CMyString & inString) 28 29 int len = std::strlen(inString.m_pdata); 30 m_pdata = new char[len +1]; 31 std::strncpy(m_pdata, inString.m_pdata, len); 32 m_pdata[len] = ‘\\0‘; 33 34 35 CMyString::~CMyString() 36 37 delete[] m_pdata; 38 m_pdata = nullptr; 39 40 41 CMyString & CMyString::operator=(const CMyString & instring) 42 43 //如果是同一个对象,不做处理直接返回 44 if (this == &instring) 45 46 return *this; 47 48 49 //使用入参通过拷贝构造函数创建一个临时对象 50 CMyString tmpString(instring); 51 //修改data指针,当函数结束时,tmpString对象过期,将自动调用析构函数,把原来当前对象的data地址释放掉 52 char* tmpData = tmpString.m_pdata; 53 tmpString.m_pdata = m_pdata; 54 m_pdata = tmpData; 55 56 return *this; 57 58 59 CMyString & CMyString::operator=(const char * str) 60 61 delete m_pdata; 62 if (str) 63 64 int len = std::strlen(str); 65 m_pdata = new char[len + 1]; 66 std::strncpy(m_pdata, str, len); 67 m_pdata[len] = ‘\\0‘; 68 69 else 70 71 //创建一个空的data,占一个字节空间 72 m_pdata = new char[1]; 73 m_pdata[0] = ‘\\0‘; 74 75 return *this; 76 77 78 char & CMyString::operator[](const int index) 79 80 return m_pdata[index]; 81 82 83 const char& CMyString::operator[](const int index) const 84 85 return m_pdata[index]; 86 87 88 bool CMyString::operator==(const CMyString & inString) const 89 90 return !std::strcmp(m_pdata, inString.m_pdata); 91 92 93 bool CMyString::operator!=(const CMyString & inString) const 94 95 return std::strcmp(m_pdata, inString.m_pdata); 96 97 98 bool CMyString::operator>(const CMyString & inString) const 99 100 return (std::strcmp(m_pdata, inString.m_pdata) > 0); 101 102 103 bool CMyString::operator<(const CMyString & inString) const 104 105 return (std::strcmp(m_pdata, inString.m_pdata) < 0); 106 107 108 bool CMyString::operator>=(const CMyString & inString) const 109 110 return (std::strcmp(m_pdata, inString.m_pdata) >= 0); 111 112 113 bool CMyString::operator<=(const CMyString & inString) const 114 115 return (std::strcmp(m_pdata, inString.m_pdata) <= 0); 116 117 118 std::ostream & operator<<(std::ostream & os, const CMyString & instring) 119 120 os << instring.m_pdata; 121 return os; 122
CMystring类的测试文件testCMyString.cpp
1 #include <iostream> 2 #include "CMyString.h" 3 4 using namespace std; 5 int main() 6 7 CMyString myString1("abc"); 8 CMyString myString2("bcd"); 9 CMyString myString3(myString2); 10 myString3[2] = ‘e‘; 11 12 cout << myString1 << "\\t" << myString2 << "\\t" << myString3 << endl; 13 cout << myString1[2] << endl; 14 cout << (myString1 != myString2) << endl; 15 cout << (myString1 == myString2) << endl; 16 cout << (myString1 < myString2) << endl; 17 cout << (myString1 <= myString2) << endl; 18 cout << (myString1 > myString2) << endl; 19 cout << (myString1 >= myString2) << endl; 20 return 0; 21
测试结果:
以上是关于一个简单实现的string类的主要内容,如果未能解决你的问题,请参考以下文章