#ifndef __MYSTRING__ #define __MYSTRING__ //实现字符串-类,构造函数中将指针作为参数 class String { public: String(const char* cstr=0); //需要自己写拷贝构造函数和拷贝赋值函数,实现“深拷贝”;否则会直接复制指针m_data,这样多个对象中的m_data指向的同一片地址,这叫“浅拷贝” String(const String& str); String& operator=(const String& str); //需要自己写析构函数,因为在构造函数中可能动态分配了内存,使用默认的析构函数会造成内存泄漏 ~String(); char* get_c_str() const { return m_data; } private: char* m_data; }; #include <cstring> //构造函数,首先判断从指针参数是不是0 inline String::String(const char* cstr) { if (cstr) { m_data = new char[strlen(cstr)+1]; strcpy(m_data, cstr); } else { m_data = new char[1]; *m_data = '\0'; } } inline String::~String() { //分配内存时,分配的是数组形式,现在要用delete[] delete[] m_data; } //拷贝赋值函数,为了可以使用连等a=b=c的形式,所以返回值不能为void inline String& String::operator=(const String& str) { //判断是不是赋值给本身 if (this == &str) return *this; delete[] m_data; //下行中的str.m_data可以直接取私有变量m_data,是因为相同类型的对象互为friend m_data = new char[ strlen(str.m_data) + 1 ]; strcpy(m_data, str.m_data); return *this; } inline String::String(const String& str) { m_data = new char[ strlen(str.m_data) + 1 ]; strcpy(m_data, str.m_data); } #include <iostream> using namespace std; ostream& operator<<(ostream& os, const String& str) { os << str.get_c_str(); return os; } #endif