class String
{
public:
String(const char* cstr = 0);
String(const String& str);
String& operator=(const String& str);
~String();
char* get_c_str() const {
return m_data;}
private:
char* m_data;
};
inline
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.m_data) + 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;
}
1.思考字符串需要什么数据–创建指针
2.思考准备哪些函数开放给外界调用
①创建构造函数 接受一个指针
②创建拷贝构造函数 传递reference
③拷贝赋值 (来源端拷贝到目的端)
④创建析构函数
⑤创建辅助函数 为了字符串console out
3.设计构造函数 inline function
①分配足够空间放初值(new一个空间)
②若未传进初值或传进初值为0
4.设计析构函数 释放空间 inline function
5.设计拷贝构造函数
①来源端参数str
②目的端new一个足够大的内存空间
③将初值拷贝到目的端
6. 设计拷贝赋值函数 (为成员函数)
①写出参数列
②标明返回类型
③删除目的端空间
④重新分配一个足够大的空间
⑤把来源端拷贝到目的端
⑥赋值完毕 return 返回的值实质上是以初始化的形式赋给调用点的临时变量 即
在函数的调用点存在一个临时变量,我们不必在乎这个变量类型 因为系统会用return的值初始化这个临时变量
⑦注意检查拷贝赋值是否为自我赋值(来源端和目的端相同)