MyString.h
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; //在这里定义类只写类的函数名,不写类的函数体 //C中没有字符串,字符串(C风格字符串) //空串 class MyString { public: MyString(); MyString(const char *p ); MyString(const MyString& s); ~MyString(); public://重载等号操作符 //原型1 //s4= "s2222" MyString& MyString::operator=(const char *p); //原型2 //s4 = s2; MyString& MyString::operator=(const MyString &s); char& operator[](int index); //重载<< friend ostream& operator<<(ostream &out,MyString &s); //重载>> friend istream& operator>>(istream &in ,MyString &s); public://重载 == != bool operator==(const char *p) const; bool operator==(const MyString& s) const; bool operator!=(const char *p)const; bool operator!=(const MyString& s) const ; public://重载 > < int operator<(const char *p); int operator>(const char *p); int operator<(const MyString& s); int operator>(const MyString& s); public: char *c_str() { return m_p; } const char *c_str2() { return m_p; } int length() { return m_len; } protected: private: int m_len; char *m_p; };
MyString.cpp
#include "MyString.h" MyString::MyString() { m_len = 0; m_p = new char[m_len + 1]; strcpy(m_p,""); } MyString::MyString(const char *p ) { if (p == NULL) { m_len = 0; m_p = new char[m_len + 1]; strcpy(m_p,""); } else { m_len = strlen(p); m_p = new char[m_len + 1]; strcpy(m_p,p); } } //拷贝构造函数 //MyString s3 = s2; MyString::MyString(const MyString& s) { m_len = s.m_len; m_p = new char[m_len + 1]; strcpy (m_p,s.m_p); } MyString::~MyString() { if (m_p != NULL) { delete[] m_p; m_p = NULL; m_len = 0; } } MyString& MyString::operator=(const char *p) { //旧内存释放掉 if (m_p != NULL) { delete [] m_p; m_len = 0; } //根据p分配内存 if (p == NULL) { m_len = 0; m_p = new char[m_len + 1]; strcpy(m_p ,""); } else { m_len = strlen(p); m_p = new char[m_len + 1]; strcpy(m_p ,p); } return *this; } //原型2 //s4 = s2; MyString& MyString::operator=(const MyString &s) { //旧内存释放掉 if (m_p != NULL) { delete [] m_p; m_len = 0; } //根据s分配内存 m_len = s.m_len; m_p = new char[m_len + 1]; strcpy(m_p ,s.m_p); return *this; } ostream& operator<<(ostream &out,MyString &s) { out<<s.m_p; return out; } char& MyString::operator[](int index) { return m_p[index]; } //重载== != //按alt,向下滑 //if (s2 == "s22222") bool MyString::operator==(const char *p) const { if (p == NULL) { if (m_len == 0) { return true; } else { return false; } } else { //strcmp比较两个字符串 //若str1==str2,则返回零; //若str1<str2,则返回负数; //若str1>str2,则返回正数。 if (m_len == strlen(p)) { return !strcmp(m_p,p); } else { return false; } } } bool MyString::operator!=(const char *p) const { return !(*this == p); } bool MyString::operator==(const MyString& s) const { if (m_len != s.m_len) { return false; } if (strcmp(m_p,s.m_p)) { return true; } } bool MyString::operator!=(const MyString& s) const { return !(*this == s); } //重载 < > //if (s3 < "bbbb") int MyString::operator<(const char *p) { return strcmp(this->m_p,p); } int MyString::operator>(const char *p) { return strcmp(p,this->m_p); } int MyString::operator<(const MyString& s) { return strcmp(this->m_p,s.m_p); } int MyString::operator>(const MyString& s) { return strcmp(s.m_p,m_p); } istream& operator>>(istream &in ,MyString &s) { cin>>s.m_p; return in; }
MyString_Test.cpp
#include<iostream> using namespace std; #include "MyString.h" int main01() { MyString s1; MyString s2("s2"); MyString s2_2 = NULL; MyString s3 = s2; MyString s4 = "s4444444"; //测试运算符重载 和 重载 【】 // = s4 = s2; s4= "s2222"; s4[1] = '4'; printf("%c",s4[1]); //第一步承认它是一个等号 //原型1 //MyString& operator=(const char *p) //原型2 //MyString& operator=(const MyString &s) //s4[0]; //char& operator[](int index) cout<< s4 <<endl; //ostream& operator<<(ostream &out,MyString &s) system("pause"); return 0; } int main02() { MyString s1; MyString s2("s2"); MyString s3 = s2; //bool operator==(const char *p); //bool operator==(const MyString& s); //bool operator!=(const char *p); //bool operator!=(const MyString& s); if (s2 == "s22222") { printf("相等\n"); } else { printf("不相等\n"); } if (s3 == s2) { printf("相等\n"); } else { printf("不相等\n"); } system("pause"); return 0; } int main03() { MyString s1; MyString s2("s2"); MyString s3 = s2; s3 = "aaa"; //int operator<(const char *p) //int operator>(const char *p) //int operator<(const Mystring& s) //int operator>(const Mystring& s) if (s3 < "bbbb") { printf("小于\n"); } else { printf("大于\n"); } /* if (s3 < s2) { printf("小于\n") } else { printf("大于\n"); }*/ /* MyString s4 = "aaaaffff"; strcmp(s4.c_str(),"aa111"); cout<<s4<<endl; */ system("pause"); return 0; } /*还是有问题*/ //int main() //{ // MyString s1(128); // cin>>s1; // // //istream& operator>>(istream &in ,MyString &s); // // system("pause"); // return 0; //}