1.防衛式聲明
2.字符串是大小不固定的,那就是用指針來動態分配內存,用new的方式動態分配一個內存,所以在private中應該是一個char* m_data;
3.接下來準備構造函數,放在public裏,構造函數與class同名。String(const char* cstr=0);給予默認值0;
4.類內帶有指針,就要去考慮三個特殊函數:
拷貝構造(String (const String& str);)
拷貝賦值(String& operator=(const String& str);)
析構函數(~String();)
5.取字符串 char* get_c_str() const {return m_data;};
6.ctor:放在class本體外來寫。
構造函數的步驟:分配空間,轉型(編譯器),傳參。別忘記判斷傳入的是否有效。
String::String(const char* cstr = 0)
{
if(cstr)
{
m_data=new char[strlen(cstr)+1];
stcpy(m_data,cstr);
}
else
{
m_data=new char[1];
*m_data='/0';
}
}
7.dtor:放在本體外來寫,儘量寫上inline
String::~String()
{
delete[] m_data;
}
8.copy ctor(拷貝構造)
拷貝構造就是來源端拷貝到目的端,分配空間,再拷貝,代碼如下:也希望成爲內斂函數,代碼沒加inline
String::String(const String& str)
{
m_data=new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
}
關於inline什麼時候加,什麼情況都能加,編譯器會自己判斷,沒有不好的影響。
9.拷貝賦值
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;
}
關於拷貝賦值的返回值,爲什麼是String&而不是void:假設賦值語句a=b;這句話不管是String&還是void,都是沒問題,但是如果是a=b=c;那麼就會出錯。
以及String&與&str兩個&符號的含義,一個是引用,一個是取地址。在我的學習筆記有記錄:指針與引用
以及良好的習慣,需要判斷是否自我賦值,若沒有,不僅是效率問題,也可能會出錯。