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;
};
#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;
//}