详解C++中实现继承string类的MyString类的步骤
昨天师兄又出了道测试题,让我们实现类似于string类的没有MyString类,刚开始很头疼,可是真正在自己写代码的时候又很兴奋的发现,这个过程真的是个很宝贵的机会,让我又有机会可以很好的熟悉回顾C++的很多知识―类设计,构造析构函数,成员函数,友元函数,引用,重载,字符串操作,动态内存分布。。。。。于是昨天花了半天时间写了300多行代码,并认真的进行了相关测试、修改和总结。因为内容有点丰富,所以想分几次写出来,条理也清楚些。 类的空间分配:类给它的每个对象都分配了独立的空间去存储它的数据成员,所有的对象公共的访问类方法进行操作。同时在对象的独立空间中,不包括数据成员动态分配的空间,对象只是记录了动态分配空间的地址(所以在析构函数调用的时候只是删除了对像空间,同时需要用new来删除动态分配的地址)。 一、类声明―mystring.h: MyString(); 复制构造函数: MyString(const MyString &str); 给定了一定初始化参数的构造函数: MyString(const char*str); 2.析构函数: 3.成员函数: MyString &operator=(const MyString &str); //利用已有的string对象通过=给一个对象进行赋值 MyString &operator=(const char*str); //直接用常量字符串进行赋值 一般赋值函数: MyString &assign(const MyString&str); MyString &assign(const char*sstr); 几个处理字符串的成员函数: size_t getsize()const; //返回字符串大小 void clear(); //把字符串清空 bool empty(); //判断字符串是否为空 void swap(MyString &str); //交换两个字符串 int compare(const MyString &str)const; //比较2个字符串的大小 //第一个const说明显式调用的字符串不可更改,括号外面的const说明隐式调用的字符串不可更改,只读数据 int compare(const char*str); 追加函数: MyString &operator+=(const MyString&str); MyString &operator+=(const char*str); MyString &append(const MyString&str); MyString &append(const char *str); 生成字串: MyString substr(size_t pos = 0,n=npos) const;生成字串,从第0个位置开始长度为n,若N超过长度,则为输出整个字符串的长度 4.友元函数(运算符重载): friend bool operator==(const MyString &str1,const MyString &str2); friend bool operator==(const char *str,const MyString &str2); friend bool operator==(const MyString &str1,const MyString *str2); friend bool operator>(const MyString &str1,const MyString &str2); friend bool operator>(const char*str1,const MyString &str2); friend bool operator>(const MyString &str1,const char*str2); 同样还有<等各种比较。 friend MyString operator+(const MyString &str1,const MyString &str2); friend MyString operator+(const char*str1,const MyString &str2); //两个字符串进行相加 friend MyString operator+(const MyString &str1,const char*str2); friend ostream & operator<<(ostream &os,const MyString &str); //输出命令符的重载 5.成员数据变量: char *string; //指向字符串的指针 int length; //字符串的长度 static const int string_number = 0; //计数创建的字符串的数目 二、实现.cpp文件: MyString::MyString() { length = 0; string = new char; char *s = "/0"; memcpy(string,s,1); ++string_number; } MyString::MyString(const char*str) { length = strlen(str); string = new char(length+1); memcpy(string,length); ++string_number; } MyString::MyString(MyString &str) { length = str.length; string = str.string; ++string_number; } MyString::~MyString() { delete[]string; --string_number; } 几个注意的问题: MyString::MyString() { length = 0; string = new char; string = "/0"; ++string_number; } 那么我们在编译和实现的时候都不会发现有什么错,但是析构函数使用delete【】释放内存使执行结果会出现乱码,因为string=“/0” MyString &MyString::operator+=(const MyString&str) { char *dest; dest = new char[str.length+length+1]; memcpy(dest,string,length); memcpy(dest+length,str.string,str.length+1); delete[]string; length = length+str.length; string = dest; return*this; } MyString &MyString::operator+=(const char*str) { char *dest; dest = new char[strlen(str)+length+1]; memcpy(dest,str,strlen(str)+1); delete[]string; string = dest; return *this; } //字符串赋值 MyString &MyString::operator=(const MyString&str) { if(&str == this) return *this; delete[]string; string = new char[str.length]; memcpy(string,str.length); length = str.length; return *this; } size_t MyString::getsize(MyString &str) { return strlen(str.string); } void MyString::clear() { length = 0; while(string!='/0') *string ='/0'; } bool MyString::empty() { return strlen(string)==0; } int MyString ::compare(const MyString &str) { return compare(string,str.string); } void MyString::swap(MyString &str) { char *temp; temp = string; string = str.string; str = temp; } Mystring MyString::substr(sizez_t pos=0,size_t n )const { MyString string; delete[]string.string; if(n>length) { string.length = length; string.string = new char[length+1]; memcpy(string.string,length+1); return string; } length = n; string.string = new char[length+1]; memcpy(string.string,length+1); return string; } 注意的几个问题: friend bool operator==(const MyString &str1,const MyString &str2) return strcmp(str1.string,str2.string)==0; friend MyString operator+(const MyString &str1,const MyString &str2) { MyString mystring; char *dest; dest = new char[str1.length+str2.length+1]; memcpy(dest,str1.string,str1.length); memcpy(dest+str1.length,str2.string,str2.length+1); delete[]mystring.string; mystring.string = dest; mystring.length = str1.length+str2.length; return mystring; } friend ostream &operator<<(ostream &os,const MyString &str) { os<<str.string; return os; } 注意的问题和上面差不多,这里就不重复了~~~ 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |