MyString.h文件:
#pragma once
#include <iostream>
using namespace std;
class MyString
{
public:
MyString();
MyString(const char* str);
MyString(const MyString& myString);
~MyString();
public:
MyString& operator=(const char* p);
MyString& operator=(const MyString& str);
char& operator[](int i);
friend ostream& operator<<(ostream& out, MyString& str);
friend istream& operator>>(istream& in, MyString& str);
bool operator!=(const char* p);
bool operator!=(const MyString& str);
bool operator==(const char* p);
bool operator==(const MyString& str);
//把指针露出
public:
char* c_str()
{
return m_str;
}
const char* c_str2()
{
return m_str;
}
int c_length()
{
return m_length;
}
private:
char* m_str;
int m_length;
};
MyString.cpp文件:
#define _CRT_SECURE_NO_WARNINGS
#include "MyString.h"
using namespace std;
MyString::MyString()
{
m_length = 0;
m_str = new char[m_length + 1];
strcpy(m_str, "");
}
MyString::~MyString()
{
if (m_str != NULL)
{
delete[] m_str;
m_str = NULL;
m_length = 0;
}
}
MyString::MyString(const char* s)
{
if (s == NULL)
{
m_length = 0;
m_str = new char[m_length + 1];
strcpy(m_str, "");
}
else
{
m_length = strlen(s);
m_str = new char[m_length + 1];
strcpy(m_str, s);
}
}
MyString::MyString(const MyString& myString)
{
m_length = myString.m_length;
m_str = new char[myString.m_length + 1];
strcpy(m_str, myString.m_str);
}
//s="aaaa"
MyString& MyString::operator=(const char* p)
{
//首先释放旧的内存
if (m_str != NULL)
{
delete[] m_str;
m_length = 0;
}
//根据p分配
if (p == NULL)
{
m_length = 0;
m_str = new char[m_length + 1];
strcpy(m_str, "");
}
else
{
m_length = strlen(p);
m_str = new char[m_length + 1];
strcpy(m_str, p);
}
return *this;
}
//s1=s2
MyString& MyString::operator=(const MyString& str)
{
//首先释放旧的内存
if (m_str != NULL)
{
delete[] m_str;
m_length = 0;
}
//根据str分配
m_length = str.m_length;
m_str = new char[m_length + 1];
strcpy(m_str, str.m_str);
return *this;
}
char& MyString::operator[](int i)
{
return m_str[i];
}
bool MyString::operator!=(const char* p)
{
return !(*this == p);
}
bool MyString::operator!=(const MyString& str)
{
if (m_length !=str.m_length)
{
return true;
}
for (int i = 0; i < str.m_length; i++)
{
if (m_str[i] != str.m_str[i])
{
return true;
}
}
return false;
}
//if(s == "sssaaa")
bool MyString::operator==(const char* p)
{
if (p == NULL)
{
if (m_length == 0)
{
return true;
}
else
{
return false;
}
}
else
{
if (m_length == strlen(p))
{
//strcmp:若str1=str2,则返回零
return !strcmp(m_str,p);
}
else
{
return false;
}
}
}
//if(s1==s2)
bool MyString::operator==(const MyString& str)
{
return !(*this != str);
}
MyString_Test.cpp文件:
#define _CRT_SECURE_NO_WARNINGS
#include "MyString.h"
ostream& operator<<(ostream& out, MyString& str)
{
cout << str.m_length << " " << str.m_str << endl;
return out;
}
istream& operator>>(istream& in, MyString& str)
{
if (str.m_str == NULL)
{
cout << "右移操作符 " << "str.m_str为空" << endl;
}
else
{
cout << "右移操作符 " << str.m_str << endl;
}
return in;
}
int main()
{
MyString str1("aaaa"),str2("this is a message");
MyString str3;
MyString str3_3 = NULL;
MyString str4(str1);
//调用copy构造函数
MyString str5 = str2;
MyString str6;
//若没有重写=,此处依然成功
str3 = str2;
str3_3 = "bbbbb";
printf("str1:%s\n", str1);
printf("str2:%s\n", str2);
printf("str3:%s\n",str3);
printf("str3_3:%s\n", str3_3);
printf("str4:%s\n", str4);
printf("str5:%s\n", str5);
printf("str6:%s\n", str6);
//cout.operator<<(str2)
cout << str2;
cin >> str2 >> str6;
if (str3 != str2)
{
cout << "不相等" << endl;
}
if (str3 == str2)
{
cout << "相等" << endl;
}
cout << str2[2] << endl;
str2[2] = 'a';
cout << str2[2] << endl;
MyString s7 = "abcdefg";
strcpy(s7.c_str(),"123");
cout << s7 << endl;
system("pause");
return 0;
}
输出: