头文件
#include <string.h>
#include <iostream>
class MyString {
public:
MyString(const char * str = nullptr);
MyString(const MyString & str);
MyString(size_t count, char c);
~MyString();
MyString & operator= (const MyString & str);
bool operator== (const MyString & str);
const char * c_str() const;
size_t size() const;
friend std::istream & operator>>(std::istream & is, MyString & str);
friend std::ostream & operator<<(std::ostream & os, const MyString & str);
private:
char * data;
size_t length;
};
源文件
#include "my_string.h"
using namespace std;
MyString::MyString(const char * str) {
if(!str) {
length = 0;
data = new char[1];
*data = '\0';
} else {
length = strlen(str);
data = new char[length + 1];
strcpy(data, str);
}
cout << "MyString(const char * str)" << endl;
}
MyString::MyString(const MyString & str) {
length = str.length;
data = new char[length + 1];
strcpy(data, str.c_str());
cout << "MyString(const MyString & str)" << endl;
}
MyString::MyString(size_t count , char c) {
length = count;
data = new char[count + 1];
for(size_t i = 0; i < count; i++) {
*(data + i) = c;
}
}
MyString::~MyString() {
length = 0;
delete [] data;
}
MyString & MyString::operator=(const MyString & str) {
if(*this == str) {
return *this;
}
delete [] data;
length = str.length;
data = new char[length + 1];
strcpy(data, str.c_str());
cout << "operator=" << endl;
return * this;
}
bool MyString::operator==(const MyString & str) {
if(length != str.length) {
return false;
}
return strcmp(data, str.c_str()) ? false : true;
}
const char * MyString::c_str() const {
return data;
}
size_t MyString::size() const {
return length;
}
istream & operator>>(istream & is, MyString & str) {
char tem[1000];
is >> tem;
str.length = strlen(tem);
delete [] str.data;
str.data = new char[str.length + 1];
strcpy(str.data, tem);
return is;
}
ostream & operator<<(ostream & os, const MyString & str) {
os << str.data;
return os;
}