String的實現涉及很多C++的基礎知識、內存控制及異常處理等問題,仔細研究起來非常復雜,本文主要做一個簡單的總結和歸納。
一、整體框架
面試時由于時間關系,面試官一般不會要求很詳盡的String的功能,一般是要求實現構造函數、拷貝構造函數、賦值函數、析構函數這幾個非常重要的部分。因為String里涉及動態內存的管理,默認的拷貝構造函數在運行時只會進行淺復制,即只復制內存區域的指針,會造成兩個對象指向同一塊內存區域的現象。如果一個對象銷毀或改變了該內存區域,會造成另一個對象運行或者邏輯上出錯。這時就要求程序員自己實現這些函數進行深復制,即不止復制指針,需要連同內存的內容一起復制。
除了以上四個必須的函數,這里還實現了一些附加的內容。
1.若干個運算符重載,這里的幾個是常見的運算符,可以加深對String的認識和運算符重載的理解。
2.兩個常用的函數,包括取字符串長度和取C類型的字符串。
3.兩個處理輸入輸出的運算符重載,為了使用的方便,這里把這兩個運算符定義為友元函數。
整體的類的框架如下所示。
class String
{
public:
String(const char *str = NULL); //通用構造函數
String(const String &str); //拷貝構造函數
~String(); //析構函數
String operator+(const String &str) const; //重載+
String& operator=(const String &str); //重載=
String& operator+=(const String &str); //重載+=
bool operator==(const String &str) const; //重載==
char& operator[](int n) const; //重載[]
size_t size() const; //獲取長度
const char* c_str() const; //獲取C字符串
friend istream& operator>>(istream &is, String &str);//輸入
friend ostream& operator<<(ostream &os, String &str);//輸出
private:
char *data; //字符串
size_t length; //長度
};
注意,類的成員函數中,有一些是加了const修飾的,表示這個函數不會對類的成員進行任何修改。一些函數的輸入參數也加了const修飾,表示該函數不會對改變這個參數的值。
二、具體實現
下面逐個進行成員函數的實現。
同樣構造函數適用一個字符串數組進行String的初始化,默認的字符串數組為空。這里的函數定義中不需要再定義參數的默認值,因為在類中已經聲明過了。另外,適用C函數strlen的時候需要注意字符串參數是否為空,對空指針調用strlen會引發內存錯誤。
String::String(const char *str)//通用構造函數
{
if (!str)
{
length = 0;
data = new char[1];
*data = '亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区