c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的。
今天我们自己来简单来实现MyString类来模拟 string类能做得一些事情。重载+、[]、==、!=、<<、>> 几个运算符。
写法和自定数组类型重载相关运算符差不多,多了一个+ 拼接运算符重载。
#pragma once
#ifndef __MY_STRING_H__
#define __MY_STRING_H__
#include
using namespace std;
class MyString
{
public:
MyString();
MyString(int len);
MyString(const char* str);
//拷贝构造函数
MyString(const MyString &another);
friend ostream& operator<<(ostream &cout, MyString& myString);
friend istream& operator >> (istream &cin, MyString& myString);
MyString& operator=(const MyString& another);
char& operator[](int index);
bool operator==(MyString& another);
bool operator!=(MyString& another);
MyString operator+(const MyString& myString);
~MyString();
private:
int length;//实际字符个数
char* str;
};
#endif // !__MY_STRING_H__
#include "MyString.h"
MyString::MyString()
{
this->length = 0;
this->str = NULL;
}
MyString::MyString(int len)
{
//cout << "构造函数 MyString::MyString(int len)...." << endl;
this->length = len;
this->str = new char[len];
//初始位空串
memset(this->str, 0, len);
}
MyString::MyString(const char* str)
{
//cout << "构造函数 MyString::MyString(const char* str)...." << endl;
if (str == NULL)
{
this->length = 0;
this->str = new char[1];
strcpy(this->str, "");
return;
}
this->length = strlen(str);
this->str = new char[this->length + 1];
strcpy(this->str, str);
}
//初始化时调用
MyString::MyString(const MyString & another)
{
//cout << "拷贝构造函数 MyString::MyString(const MyString & another)...." << endl;
this->length = another.length;
this->str = new char[this->length+1];
strcpy(this->str, another.str);
}
MyString & MyString::operator=(const MyString & another)
{
//cout << "赋值运算符 MyString & MyString::operator=(const MyString & another)...." << endl;
// 防止自身赋值
if (this == &another)
{
return *this;
}
// 如果自身原来有空间,先释放
if (this->str != NULL)
{
delete[] this->str;
this->str = NULL;
this->length = 0;
}
// 新开辟空间进行内容拷贝
this->length = another.length;
this->str = new char[this->length + 1];
strcpy(this->str, another.str);
return *this;
}
char& MyString::operator[](int index)
{
return (this->str[index]);
}
bool MyString::operator==(MyString & another)
{
if (this == &another)
{
return true;
}
if (this->length != another.length)
{
return false;
}
if (strcmp(this->str, another.str) != 0)
{
return false;
}
return true;
}
bool MyString::operator!=(MyString & another)
{
return !(*this==another);
}
MyString MyString::operator+(const MyString& another)
{
int len = this->length + another.length + 1;
MyString str1(len);
strcat(str1.str, this->str);
strcat(str1.str, another.str);
return str1;
}
MyString::~MyString()
{
//cout << "~MyString()" << endl;
if (this->str != NULL)
{
delete[] this->str;
this->str = NULL;
this->length = 0;
}
}
ostream & operator<<(ostream & cout, MyString & myString)
{
if(myString.str!=NULL)
cout << myString.str;
return cout;
}
istream & operator >> (istream & cin, MyString & myString)
{
// 如果原来有字符串,将其清空
if (myString.str != NULL)
{
delete[] myString.str;
myString.str = NULL;
myString.length = 0;
}
//输入长度未知,用临时变量接收,然后进拷贝
char temp[1024] = { 0 };
cin >> temp;
int len = strlen(temp);
myString.length = len;
myString.str = new char[len + 1];
//注意:如果目标空间大于等于源字符串strcpy会复制到\0
strcpy(myString.str, temp);
return cin;
}
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include "MyString.h"
using namespace std;
int main(int argc, char *argv[])
{
MyString str1("hello");//构造函数
MyString str2("world");//构造函数
//cout << str1 << str2 << endl;
MyString str3 = str1;//调用拷贝构造函数
cout << str3 <> str1 >> str2;
str4 = str1 + str2;
cout << str4 << endl;
MyString aa("aaa");
MyString bb("aaa");
cout <<"aa = " << aa<< ",bb = "<<
bb <<",aa==bb:" << boolalpha << (aa == bb) <