string的本質其實是個類,而char十個內建類型 不屬於類。其次在初始化的時候,一點要注意string不可以設置爲null,(如果你以前習慣 char * str = null),這是因爲string的賦值函數的實現會直接傳入進入 調用這個null的內部變量出錯。大家可以看如下代碼
- String & String::operate =(const String &other)
- {
- // (1) 檢查自賦值
- if(this == &other)
- return *this;
- // (2) 釋放原有的內存資源
- delete [] m_data;
- // (3)分配新的內存資源,並複製內容
- <span style="white-space:pre"> </span>int length = strlen(other.m_data);
- <span style="white-space:pre"> </span>m_data = new char[length+1];
- strcpy(m_data, other.m_data);
- // (4)返回本對象的引用
- return *this;
- }
- String::String(const char *str)
- {
- if(str==NULL)
- {
- <span style="white-space:pre"> </span>m_data = new char[1]; // 得分點:對空字符串自動申請存放結束標誌'\0'的空
- //加分點:對m_data加NULL 判斷
- <span style="white-space:pre"> </span>*m_data = '\0';
- }
- else
- {
- <span style="white-space:pre"> </span>int length = strlen(str);
- <span style="white-space:pre"> </span>m_data = new char[length+1]; // 若能加 NULL 判斷則更好
- <span style="white-space:pre"> </span>strcpy(m_data, str);
- }
- }
默認的情況下string定義const char * str = NULL
所以會執行if, 這裏面會涉及內存開闢已經完成,沒有內存可以分配情況
- {
- <span style="white-space:pre"> </span>m_data = new char[1]; // 得分點:對空字符串自動申請存放結束標誌'\0'的空
- //加分點:對m_data加NULL 判斷
- <span style="white-space:pre"> </span>*m_data = '\0';
- }
這裏面可以寫成
- {
- <span style="white-space:pre"> </span>m_data = new char[1]; // 得分點:對空字符串自動申請存放結束標誌'\0'的空
- //加分點:對m_data加NULL 判斷
- if(m_data != NULL)
- {
- <span style="white-space:pre"> </span>*m_data = '\0';
- }
- }