笔试题string实现

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

class mystring{
public:
mystring(const char *str = NULL);//构造函数
mystring(const mystring &str);//拷贝构造函数
~mystring();//析构函数
mystring &operator=(const mystring &str);//运算符重载
int size() const;//字符串实际大小,不包含结束符
const char *c_str() const;
mystring operator+(const mystring &str) const;//重载+

private:
char *data;
int length;
};

mystring mystring::operator+(const mystring &str) const {

mystring newstr;
newstr.length = length + str.size();
newstr.data = new char[newstr.length + 1];
strcpy(newstr.data, data);
strcat(newstr.data, str.data);
printf ("line:%d\n", __LINE__);
cout << "this->data = " << newstr.data << endl;
return newstr;
}


mystring & mystring::operator = (const mystring &str) {
if (this == &str)//检查自赋值
return *this;

if (data)
delete[] data;

length = str.size();
//length = strlen(str.data);
data = new char[length + 1];
strcpy(data, str.c_str());
printf ("line:%d\n", __LINE__);
cout << "this->data = " << this->data << endl;

return *this;
}

//通用构造函数
mystring::mystring(const char *str) {
if (!str) {
length = 0;
data = new char[1];
*data = '\0';

printf ("line:%d\n", __LINE__);
} else {
length = strlen(str);
data = new char[length + 1];
strcpy(data, str);

printf ("line:%d\n", __LINE__);
cout << "this->data = " << this->data << endl;
}
}

//拷贝构造函数
mystring::mystring(const mystring &str) {
length = str.size();
data = new char[length + 1];
strcpy(data, str.c_str());
printf ("line:%d\n", __LINE__);
cout << "s3 = " << this->data << endl;
}

//析构函数
mystring::~mystring() {
delete []data;
length = 0;
printf ("line:%d\n", __LINE__);
}

//计算大小
int mystring::size() const {

return length;
}

//将string转c_str()
const char *mystring::c_str() const {
return data;
}

int main() {
mystring s;
printf ("line:%d\n", __LINE__);

char a[] = "hello";
char b[] = "world!";
//通用构造函数
mystring s1(a),s2(b);
//拷贝构造函数
mystring s3(s1);
//+重载
mystring s5 = s1 + s2;
//赋值函数
s1 = s2;
//拷贝构造函数
mystring s4 = s1;



return 0;
}