因为一个string类的实现很能反应一个c++程序员的水平,希望以后自己能够多动手写一写这些东西;
其中比较重要的那几个构造函数和析构函数;如果能够把ostream的重载写出来将会更加流弊
class String {
friend ostream& operator<<(ostream& out, const String& str) { //这个输出符重载和friend很重要
//理解为什么要加用friend,因为不用friend人家以为你是重载的一元运算符,那么你的参数就会有问题
return str.Print(out); //返回的是ostream&类型,这样就可以和cout<<s<<endl兼容,而不是cout<<s;cout<<endl;
//将str放入stream交给print来进行 或者使用以下方式也可以;
//cout << str.m_data;
//return cout;
}
public:
String(const char* str = NULL); //构造函数 加分项:以下内容加const很重要
String(const String& other); //拷贝构造
~String(void); //析构
String& operator=(const String& other); //赋值函数
char* operator*();
private:
char* m_data;
ostream& Print(ostream& out) const;
};
String::String(const char* str) {
if (str == NULL) { //加分项:如果是空字符串,自动申请存放一个‘\0’标志
m_data = new char[1];
*m_data = '\0';
}
else {
int lenth = strlen(str);
m_data = new char[lenth + 1];
strcpy(m_data, str);
}
}
String::~String(void) {
delete[] m_data; //怎样取delete一个数组
}
String::String(const String& other) {
int length = strlen(other.m_data);
m_data = new char[length + 1]; //如果能给m_data加一个NULL判断更好
strcpy(m_data, other.m_data);
}
String& String::operator=(const String& other) {
if (this == &other) { //得分点:自检查
return *this;
}
if (m_data) delete[] m_data; //得分点:删除原来的内存资源 这儿没有用到引用计数,所以可以直接delete掉
int length = strlen(other.m_data);
m_data = new char[length + 1]; //如果能给m_data加一个NULL判断更好
strcpy(m_data, other.m_data);
return *this; //返回本对象的引用
}
char* String::operator*() {
return this->m_data;
}
ostream& String::Print(ostream& out) const {
out << m_data;
return out;
}