为了复习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 }
测试结果:
原文地址:https://www.cnblogs.com/huangwenhao/p/11122282.html
时间: 2024-11-05 15:38:15