昨天师兄又出了道测试题,让我们实现类似于string类的没有MyString类,刚开始很头疼,可是真正在自己写代码的时候又很兴奋的发现,这个过程真的是个很宝贵的机会,让我又有机会可以很好的熟悉回顾C++的很多知识—类设计,构造析构函数,成员函数,友元函数,引用,重载,字符串操作,动态内存分布。。。。。于是昨天花了半天时间写了300多行代码,并认真的进行了相关测试、修改和总结。因为内容有点丰富,所以想分几次写出来,条理也清楚些。
类的空间分配:类给它的每个对象都分配了独立的空间去存储它的数据成员,所有的对象公共的访问类方法进行操作。同时在对象的独立空间中,不包括数据成员动态分配的空间,对象只是记录了动态分配空间的地址(所以在析构函数调用的时候只是删除了对像空间,同时需要用new来删除动态分配的地址)。
类声明—mystring.h:
1. 构造函数:
专门用于构建新对象,给成员数据分配必要的内存空间并将值赋给新对象的成员数据。
默认构造函数:
在未提供显式初始化值时,被用来创建对象的构造函数(所以它一般没有参数)
MyString();
复制构造函数:
用于将一个对象复制到新创建的对象中(当然这个被复制的对象必须已经存在)。
MyString(const MyString &str);
给定了一定初始化参数的构造函数:
参数列表中的值会一次赋给新创建对象的各个成员函数:
MyString(const char*str);
2.析构函数:
当对象过期时删除对象所占的内存空间,并且当对象创建时有用New请求的内存空时,在析构函数中同时要调用delete对原来分配的 内存空间进行释放,以防止内存泄露。
~MyString();
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; //计数创建的字符串的数目