string类的成员设计
class string { private: char* _str; int _size; int _capacity; };
说明:以下的五个成员函数的模拟实现,均去除了_size
和_capacity
成员变量,目的是为了更方便解释重点。在五个成员函数模拟后,会对string类的设计进行补全。
普通构造函数的模拟
我们是否可以使用默认构造函数来初始化对象?在这种情况下是万万不能的!要记住默认的构造函数对自定义类型会去调用它自己的构造函数进行初始化,而对于内置类型是不做处理的,此时我们的成员变量_str
的类型是内置类型,不会被初始化,所以一定要自己写构造函数。
//这种构造函数是否可行? string(const char* str) { _str = str; }
这种写法做不到用字符串构造一个对象。
原因:这样会使得str
和_str
指向的都是同一块空间。str会影响到_str.
所以正确的做法是,给_str
分配一块属于自己的空间,再把str
的值拷贝给_str.
string(const char* str) { _str = new char[strlen(str) + 1]; //要多给一个' '的空间 strcpy(_str, str); }
修一下小细节:
1.实例化对象的时候是支持无参构造的,所以可以给参数一个缺省值""
,里面自己隐藏的有一个