复习String 类的实现过程
String 类的声明
class String
{
private:
char* m_data; //为了能够动态容纳字符大小,我们设置成字符指针
public:
//构造函数
String(const char* cstr=0); //有默认值的参数,防止传入的参数为空使得指针指向为空
//由于class 中含有指针变量,因此我们在设计三个(拷贝构造、拷贝赋值、析构函数)重要、特殊的函数时要注意
inline String(const String& str);
inline String& operator =(const String& str);//赋值存在来源端(参数),与目的端(返回值)
inline ~String();
//辅助函数:获取类变量的函数
inline char* get_c_str(){return m_data;}//由于函数实现简单,因此可以设置成内联函数,由于该函数没有改动m_data,因此最好采用下面的做法:
inline char* get_c_str()const{return m_data;}
}
String 类的定义
-
构造函数
String::String(const char *cstr=0) { if(cstr){ m_data=new char[strlen(cstr)+1]; strcpy(m_data,cstr); }else //如果没指定初值 { m_data=new char[1]; *m_data='\0'; } }
-
析构函数
inline //可以要求编译器将析构做成内联函数 String::~String() { delete [] m_data; //释放开过的内存 }
-
拷贝构造函数
inline String::String(const String& str) { m_data=new char[strlen(str)+1];//先分配内存 strcpy(m_data,str.m_data); //再赋值内容 }
-
拷贝赋值
inline String& String::operator=(const String& str) //此处的& 是引用 { if(this==&str){return *this} //必须排除是否自我赋值,此处的&是取地址符 delete [] m_data; //首先清除自身内容 m_data=new char[strlen(str.m_data)+1];//分配空间 strcpy(m_data,str.m_data); //赋值内容 return *this; //传出去的是指针所指的内容而非指针本身 }
思考:
为什么拷贝赋值函数需要返回值?
答:应对链式赋值的情况:a=b=c=d;