1. gzyueqian
      13352868059

      C++中string類的實(shí)現(xiàn)干貨 為你的嵌入式培訓(xùn)做準(zhǔn)備吧!

      更新時(shí)間: 2017-04-06 15:51:08來(lái)源: 粵嵌教育瀏覽量:3386

        C++中string類的實(shí)現(xiàn)干貨,為你的嵌入式培訓(xùn)做準(zhǔn)備吧!String是C++中的重要類型,程序員在C++面試中經(jīng)常會(huì)遇到關(guān)于String的細(xì)節(jié)問(wèn)題,甚至要求當(dāng)場(chǎng)實(shí)現(xiàn)這個(gè)類。只是由于時(shí)間關(guān)系,可能只要求實(shí)現(xiàn)構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)等關(guān)鍵部分。
        String的實(shí)現(xiàn)涉及很多C++的基礎(chǔ)知識(shí)、內(nèi)存控制及異常處理等問(wèn)題,仔細(xì)研究起來(lái)非常復(fù)雜,本文主要做一個(gè)簡(jiǎn)單的總結(jié)和歸納。
        一、整體框架
        面試時(shí)由于時(shí)間關(guān)系,面試官一般不會(huì)要求很詳盡的String的功能,一般是要求實(shí)現(xiàn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值函數(shù)、析構(gòu)函數(shù)這幾個(gè)非常重要的部分。因?yàn)镾tring里涉及動(dòng)態(tài)內(nèi)存的管理,默認(rèn)的拷貝構(gòu)造函數(shù)在運(yùn)行時(shí)只會(huì)進(jìn)行淺復(fù)制,即只復(fù)制內(nèi)存區(qū)域的指針,會(huì)造成兩個(gè)對(duì)象指向同一塊內(nèi)存區(qū)域的現(xiàn)象。如果一個(gè)對(duì)象銷毀或改變了該內(nèi)存區(qū)域,會(huì)造成另一個(gè)對(duì)象運(yùn)行或者邏輯上出錯(cuò)。這時(shí)就要求程序員自己實(shí)現(xiàn)這些函數(shù)進(jìn)行深復(fù)制,即不止復(fù)制指針,需要連同內(nèi)存的內(nèi)容一起復(fù)制。
        除了以上四個(gè)必須的函數(shù),這里還實(shí)現(xiàn)了一些附加的內(nèi)容。
        1.若干個(gè)運(yùn)算符重載,這里的幾個(gè)是常見(jiàn)的運(yùn)算符,可以加深對(duì)String的認(rèn)識(shí)和運(yùn)算符重載的理解。
        2.兩個(gè)常用的函數(shù),包括取字符串長(zhǎng)度和取C類型的字符串。
        3.兩個(gè)處理輸入輸出的運(yùn)算符重載,為了使用的方便,這里把這兩個(gè)運(yùn)算符定義為友元函數(shù)。
        整體的類的框架如下所示。
        class String
        {
        public:
        String(const char *str = NULL); //通用構(gòu)造函數(shù)
        String(const String &str);  //拷貝構(gòu)造函數(shù)
        ~String();      //析構(gòu)函數(shù)
        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;  //獲取長(zhǎng)度
        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; //長(zhǎng)度
        };
        注意,類的成員函數(shù)中,有一些是加了const修飾的,表示這個(gè)函數(shù)不會(huì)對(duì)類的成員進(jìn)行任何修改。一些函數(shù)的輸入?yún)?shù)也加了const修飾,表示該函數(shù)不會(huì)對(duì)改變這個(gè)參數(shù)的值。
        二、具體實(shí)現(xiàn)
        下面逐個(gè)進(jìn)行成員函數(shù)的實(shí)現(xiàn)。
        同樣構(gòu)造函數(shù)適用一個(gè)字符串?dāng)?shù)組進(jìn)行String的初始化,默認(rèn)的字符串?dāng)?shù)組為空。這里的函數(shù)定義中不需要再定義參數(shù)的默認(rèn)值,因?yàn)樵陬愔幸呀?jīng)聲明過(guò)了。另外,適用C函數(shù)strlen的時(shí)候需要注意字符串參數(shù)是否為空,對(duì)空指針調(diào)用strlen會(huì)引發(fā)內(nèi)存錯(cuò)誤。
        String::String(const char *str)//通用構(gòu)造函數(shù)
        {
        if (!str)
        {
        length = 0;
        data = new char[1];
        *data = '亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

        
        

        1. 亚洲色精品vr一区区三区 | 日本私人免费观看手机版 | 伊人狼人久久青青草原 | 中文字幕大香视频蕉 | 亚洲午夜片手机在线播放 | 亚洲欧美日韩国产不卡tv |