#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <stdlib.h>
#include <cstring>
//本质是对mystring的包装
class MyString
{
private:
char* _buffer;
int _length;
public:
/*MyString();*/
MyString(const char* str = nullptr);
MyString(const MyString& str);
MyString& operator=(const MyString& theMyString);
~MyString();
MyString operator+(const MyString& theMyString);
MyString& operator+=(const MyString& theMyString);
bool operator>(const MyString& theMyString);
bool operator<(const MyString& theMyString);
bool operator==(const MyString& theMyString);
char& operator[](int index);
char& at(int index);
char* c_str();
void printStr();
};
#endif
源文件:
#define _CRT_SECURE_NO_WARNINGS
#include "MyString.h"
//MyString::MyString() {
// _buffer = new char[1];
// *_buffer = '\0'; //设置一个空串
// _length = 0;
//};
MyString::MyString(const MyString& str) :_length{ str._length }, _buffer{ new char[str._length + 1] }
{
strcpy_s(_buffer, _length + 1, str._buffer);
}
MyString::MyString(const char* str /*= nullptr*/)
{
if (str == nullptr) {
_buffer = new char[1];
*_buffer = '\0'; //设置一个空串
_length = 0;
}
else {
_buffer = new char[strlen(str) + 1];
strcpy_s(_buffer, strlen(str) + 1, str);
_length = strlen(str);
}
}
MyString::~MyString() {
delete[] _buffer;
};
MyString MyString::operator+(const MyString& theMyString) //若是新对象,不用传引用了
{
int len = strlen(_buffer) + strlen(theMyString._buffer);
MyString newStr;
delete[] newStr._buffer;
newStr._buffer = new char[len + 1]{ 0 }; //要进行初始化
newStr._length = len;
strcat(strcat(newStr._buffer, this->_buffer),theMyString._buffer); //starcat无法被赋值
return newStr;
}
MyString& MyString::operator+=(const MyString& theMyString) //返回自身要返回引用
{
//扩充空间
int catlen = strlen(this->_buffer);
int srclen = strlen(theMyString._buffer);
int len = catlen + srclen;
this->_buffer = static_cast<char*>(realloc(this->_buffer, len + 1));
//移动指针的首地址
memset(this->_buffer+catlen, 0, srclen+1); //refresh后面多出来的空间
strcat(this->_buffer, theMyString._buffer);
//之前比较繁琐的方法
/*int len = strlen(_buffer) + strlen(theMyString._buffer);
MyString temp;
delete[] temp._buffer;
temp._buffer = new char[len + 1]{ 0 };
temp._length = len;
strcat(strcat(temp._buffer, this->_buffer), theMyString._buffer);
delete[] _buffer;
_buffer = new char[len + 1]{ 0 };
strcat(_buffer, temp._buffer);*/
return *this;
}
bool MyString::operator>(const MyString& theMyString)
{
return strcmp(this->_buffer,theMyString._buffer)>0;
}
bool MyString::operator<(const MyString& theMyString)
{
return strcmp(this->_buffer, theMyString._buffer)<0;
}
bool MyString::operator==(const MyString& theMyString)
{
return strcmp(this->_buffer, theMyString._buffer)==0;
}
//重载赋值运算符(基本格式)
MyString& MyString::operator=(const MyString& theMyString) {
if (this != &theMyString) { //这个this就是左值对象 Mystring*
delete[] _buffer; //为了防止内存泄漏
_length = theMyString._length;
_buffer = new char[_length + 1];
strcpy_s(_buffer, _length + 1, theMyString._buffer);
}
return *this;
}
char& MyString::operator[](int index)
{
return _buffer[index];
}
char& MyString::at(int index)
{
return _buffer[index];
}
char* MyString::c_str()
{
return _buffer;
}
void MyString::printStr() {
std::cout << _buffer << std::endl;
}