类String的构造函数
来源:互联网 发布:win7网络感叹号怎么办 编辑:程序博客网 时间:2024/06/01 08:45
class String{ public: //注意该构造函数原型 //也可以设为String(const char *str="");(记为原型2) //即把默认实参设为空字符串 String(const char *str=NULL); //原型1默认实参为空指针 String(const String &other); ~String(void); String& operator=(const String &other); private: char *m_data;};//String 类析构函数的实现String::~String(){ delete [] m_data;}String::String(const char *str){ if (str==NULL) //(注意) 如果采用原型2,则这几句语句可以省略 { m_data=new char[1]; //不能写成new char;因为new 与 new[]是两个不同的运算符 //析构中统一为delete[],故构造中应该统一用new[] *m_data='\0'; } else { int length=strlen(str); m_data=new char[length+1]; strcpy(m_data,str); }}//拷贝构造String::String(const String &other){ int length=strlen(other.m_data); m_data=new char[length+1]; strcpy(m_data,other.m_data);//即使other.m_data指向空字符串,仍然可以使用strcpy函数!}String& String::operator =(const String &other){ if (this==&other) return *this; delete [] m_data; int length=strlen(other.m_data);//不能使用sizeof(other.m_data),因为它永远是一个机器字的长度 m_data=new char[length+1]; strcpy(m_data,other.m_data); return *this; } //赋值函数写得不好,最好改为String& String::operator =(const String &other){ if(this != &other) { int length=strlen(other.m_data);try{ char *p =new char[length+1]; //并不能保证总会申请成功,故先不释放原内存 }catch(bac_alloc &ex){ ex.what(); exit(1);} strcpy(p,other.m_data); delete [] m_data; //此时必须释放原内存,否则就没有机会释放了 m_data = p; //让m_data指向新的成功申请的内存 return *this; }