String.h
#ifndef _MYSTRING_
#define _MYSTRING_
#include <iostream>
using namespace std;
class String
{
public:
String(const char* cstr = 0);
//class with a pointer member,big three
String(const String& str);
String& operator = (const String& str);
~String();
char* get_c_str() const {return m_data;} //const关键字
private:
char* m_data;
};
inline String::String(const char* c_str)
{
if(c_str)
{
m_data = new char[strlen(c_str) + 1];
strcpy(m_data, c_str);
}
else //是空字符串也要有一个char放入'\0'
{
m_data = new char[1];
*m_data = '\0';
}
}
inline String::String(const String& str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
inline String& String::operator = (const String& str)
{
//s1 = s1,指针指向同一块内存,但是会先清除内存中的值再申请内存赋值
if(this == &str) //如果没有,当自我赋值的时候会出错
return *this;
delete[] m_data; //清空内存中本来的东西
m_data = new char[strlen(str.m_data) + 1]; //申请合适的大小
strcpy(m_data, str.m_data); //拷贝
return *this;
}
inline String::~String()
{
delete[] m_data; //new array-delete array
}
ostream& operator << (ostream& os, const String& str)
{
os << str.get_c_str();
return os;
}
#endif
String_test.cpp
#include "String.h"
int main()
{
String s1("hello");
String s2;
String s3(s1); //拷贝构造函数
cout << s3 << s1 << endl;
s2 = s3; //拷贝赋值函数
cout << s2 << endl;
return 0;
}