您的位置:首页 > 编程语言 > C语言/C++

C++ String类简单实现

2017-07-04 13:39 337 查看
#ifndef MYSTRING_H
#define MYSTRING_H
#include<iostream>
using namespace std;
class MyString
{

/*重载<<*/
friend ostream& operator<<(ostream& _cout, MyString& _MyString)
{
_cout << _MyString.string_address;
return _cout;
}

/*重载>>*/
friend istream& operator>>(istream& _cin, MyString& _MyString)
{
if (_MyString.string_address) {
free(_MyString.string_address);
_MyString.string_address = NULL;
}

_MyString.string_address = (char*)calloc(1, 1024);
if (!_MyString.string_address)
cout << "分配内存失败" << endl;

_cin >> _MyString.string_address;
return _cin;
}

public:
/*默认无参构造*/
MyString() :string_address(NULL)
{
}

/*默认有参构造*/
MyString(const char* const_string)
{
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
}

/*拷贝构造*/
MyString(const MyString& other_MyString)
{
string_address = (char*)calloc(1, strlen(other_MyString.string_address) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, other_MyString.string_address);
}

/*析构函数*/
~MyString()
{
if (string_address){
free(string_address);
string_address = NULL;
}
}

/*普通成员函数*/
const char* c_str() const
{
return string_address;
}

/*获取字符串长度*/
size_t length()
{
return strlen(string_address);
}
size_t size()
{
return strlen(string_address);
}

/*重载=*/
MyString& operator=(const MyString& _MyString)
{
if (string_address) {
free(string_address);
string_address = NULL;
}
string_address = (char*)calloc(1, strlen(_MyString.string_address) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, _MyString.string_address);
return *this;
}
MyString& operator=(const char* const_string)
{
if (string_address) {
free(string_address);
string_address = NULL;
}
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
return *this;
}

/*重载[]*/
char& operator[](size_t index)
{
if (index >= length())
return string_address[length() - 1];
return string_address[index];
}

/*重载+=*/
MyString& operator+=(MyString& _MyString)
{
if (string_address){
if (_MyString.string_address){
string_address = (char*)realloc(string_address, length() + strlen(_MyString.string_address) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, _MyString.string_address);
}

}
else {
if (_MyString.string_address){
string_address = (char*)calloc(1, strlen(_MyString.string_address + 1));
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, _MyString.string_address);
}
}
return *this;

}
MyString& operator+=(const char* const_string)
{
if (string_address) {
if (const_string) {
string_address = (char*)realloc(string_address,length() + strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, const_string);
}
}
else {
if (const_string) {
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
}
}
return *this;
}

/*重载+*/
MyString operator+(MyString& _MyString)
{
if (string_address) {
if (_MyStr
b9fb
ing.string_address) {
string_address = (char*)realloc(string_address, length() + _MyString.length() + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, _MyString.string_address);
}
}
else {
if (_MyString.string_address) {
string_address = (char*)calloc(1, _MyString.length() + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, _MyString.string_address);
}
}
return *this;
}
MyString operator+(const char* const_string)
{
if (string_address) {
if (const_string) {
string_address = (char*)realloc(string_address, length() + strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, const_string);
}
}
else {
if (const_string) {
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
}
}
return *this;
}

/*重载 ==*/
bool operator==(MyString& _MyString)
{
if (string_address)
if (_MyString.string_address)
if (!strcmp(string_address, _MyString.string_address))
return true;
else
if (!_MyString.string_address)
return true;
return false;
}
bool operator==(const char* const_string)
{
if (string_address)
if (const_string)
if (!strcmp(string_address, const_string))
return true;
else
if (!const_string)
return true;
return false;
}

/*重载!=*/
bool operator!=(MyString& _MyString)
{
if (string_address)
if (_MyString.string_address)
if (strcmp(string_address, _MyString.string_address))
return true;
else
if (_MyString.string_address)
return true;
return false;
}
bool operator!=(const char* const_string)
{
if (string_address)
if (const_string)
if (strcmp(string_address, const_string))
return true;
else
if (const_string)
return true;
return false;
}

private:
char* string_address;
};
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息