- 正如标题所示:这篇复习带有指针类型成员的class
设计类
考虑到会有以下操作,来设计类
1 { 2 String s1(); 3 String s2("hello"); 4 String s3(s1); 5 cout << s3 << endl; 6 s3 = s2; 7 cout << s3 << endl; 8 }
函数体内第二行和第三行都是构造函数,一个含参数,一个不含参数。第四行创建一个以s1为初值的对象s3,是一个拷贝的动作,需要一个拷贝构造函数,之后会讲到;下一行是输出,需要一个操作符重载。第六行是一个赋值的操作,是一个拷贝的动作,这样第四行和第六行都是拷贝动作,所以这两个操作需要的是不同的函数,第六行需要的是拷贝赋值操作。如果,我们自己不写,编译器会给出默认的这两个操作函数,像上个复数的例子,就使用编译器给的,而这个string的例子,使用默认的就会出现不好的,想象一下,我们现在有个指针对象,指向一个地址,现在又创建一个新的对象,若只是拷贝,把指针拷贝过来,指向了同一个地方去,这并不是真正的拷贝,所以,只要class中含有带指针的成员,就不要使用默认的拷贝构造函数和拷贝赋值操作。so,string类的大致设计如下:
1 class String { 2 public: 3 String(const char* cstr = 0);//construct func 4 //if only the calss with pointer pamater(s),we need design two functions as follow 5 String(const String& str);//copy construct func,the parameter type is itsown type 6 String& operator=(const String& str);//copy assign,the parameter is itsown type 7 8 ~String(); 9 char* get_c_str()const { return m_data; } 10 private: 11 char* m_data;//因为字符串长度不定,所以设置成动态的数组-指针 12 };
设计类内函数
构造函数和析构函数
1 inline 2 String::String(const char* cstr = 0) 3 { 4 if (cstr) {//有初值 5 m_data = new char[strlen(cstr + 1)]; 6 strcpy(m_data, cstr); 7 } 8 else { 9 m_data = new char[1]; 10 *m_data = '