mystring.h
#ifndef
#define
#include <cstring>
#include <iostream>
using namespace std;
class MyString{
public:
MyString(const char* cstr=0);
MyString(const MyString& str);
MyString& operator=(const MyString& str); //类成员操作符重载只需要提供一个参数,即代表操作两个MyString对象,原对象有隐藏的this指针
~MyString();
char* get_c_str() const {return m_data;}
private:
char* m_data;
};
inline
MyString::MyString(const char* cstr){
if(cstr){
m_data=new char[std::strlen(cstr)+1]; //加1是为了存储字符串最后的\0
strcpy(m_data,cstr);
}
else{
m_data=new char[1];
*m_data='\0';
}
}
inline
MyString::~MyString()
{
delete[] m_data;
}
inline
MyString& MyString::operator=(const MyString& str)
{
if(this==&str) //为什么要有这个判断是点睛之笔,从内存的角度去了解
{
return *this;
}
delete[] m_data;
m_data=new char[std::strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
return *this;
}
inline
MyString::MyString(const MyString& str)
{
m_data=new char[std::strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
}
ostream& operator<<(ostream& os,const MyString& str)
{
os<<str.get_c_str();
return os;
}
#endif
mystring_test.cpp
#include "mystring.h"
#include <iostream>
using namespace std;
int main()
{
MyString s1("hello");
MyString s2("world");
MyString s3(s2);
cout<<s3<<endl;
s3=s1;
cout<<s3<<endl;
cout<<s2<<endl;
cout<<s1<<endl;
}
参考:
- 侯捷C++高级开发