• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            franksunny的個人技術空間
            獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

            網訊筆試歸來

            昨天去網訊(杭州)筆試了,做了下筆試題,感覺題目都不難,但是自己做的的確不怎么樣,估計是沒機會去了,不過暫時還是先把幾道自己還記得的題目,寫出來,總結下,以做復習。

            1、  要求自己實現 String 類,給出了 String 類的以下頭文件類聲明

            class String

            {

            public:

                   String(const char *m_char = NULL);

                   String(const String & Str);

                   String& operator = (const String &Str);

                   ~String();

            private:

                   char * m_Data;

            };

             

            關于 String 類的筆試題,以前看林銳的隨筆時聽說他在微軟面試時曾碰到那么一道題目,我自己也沒有真的下筆去做過,平常都是拿來就用的,這次自己碰到,才知道會死得那么慘,反正編得不堪入目(我就不拿出來獻丑了),下面是我回來后,自己重新寫的答案。

            String::String(const char* m_char)

            {

                   int m_nLength = strlen(m_char) + 1;

                   if (m_Data != NULL)

                   {

                          delete [] m_Data;

                          m_Data = NULL;

                   }// 以上判斷是否必要 ??

                   m_Data = new char[m_nLength];

                   memcpy(m_Data, m_char, m_nLength);

            }

             

            String::String(const String &Str)

            {

                   int m_nLength = strlen(Str.m_Data) + 1;// 以前真的不知道,原來對象的私有變量

            // 在類的實現代碼中也是可以訪問的

                   if (m_Data != NULL)

                   {

                          delete [] m_Data;

                          m_Data = NULL;

                   }// 以上判斷是否必要 ??

                   m_Data = new char[m_nLength];

                   memcpy(m_Data, Str.m_Data, m_nLength);

            }

             

            String& String::operator = (const String& Str) 

            {

                   if(this == &Str)

                          return *this;

             

                   int m_nLength = strlen(Str.m_Data) + 1;

                   if (m_Data != NULL)

                   {

                          delete [] m_Data;

                          m_Data = NULL;

                   }// 以上判斷是否必要 ??

                  

                   m_Data = new char[m_nLength];

                   memcpy(m_Data, Str.m_Data, m_nLength);

                   return *this;

            }

             

            String::~String()

            {

                   if (m_Data != NULL)

                   {

                          delete [] m_Data;

                          m_Data = NULL;

                   }

            }

             

            2、  關于內存分配

            這個題目很簡單,就給了一個函數,然后問函數內的局部變量存放在哪里,我也不知道為什么當時會選擇 heap( ) ,下面再把幾個概念羅列出來:

            1.            堆區( heap ):由程序員申請分配和釋放,屬動態內存分配方式,若程序員不釋放,程序結束時可能會由 OS 回收。不過這個內存分配很容易引起問題,如果申請的內存不釋放就會造成內存泄漏;如果釋放的不是所要釋放的內存,則輕者引起程序運行結果出錯,重者系統崩潰。

            2.            棧區( stack ):編譯器自動分配釋放,存放函數的形參值、局部變量的值,也是屬于動態內存分配方式,它由系統分配,所以執行效率也高,不過自由度小,聲明時就得決定其具體大小。

            3.            全局區(靜態區)( static ):全局變量和靜態變量的存儲是放在一塊的,而且初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束后由系統釋放,所以也不會造成內存問題。

            除了以上的變量外,還有兩類存放位置,文字常量區和程序代碼區,兩者都是由系統分配和釋放,且文字常量區和前面三區合成為程序數據區,與程序代碼區相對應。

            3、  關于類繼承的構造和析構函數

            class Base

            {

            public:

                   Base(){cout<< "Base" <<endl;};

                   ~Base(){cout<<"~Base"<<endl;};

            protected:

            private:

            };

             

            class First:public Base

            {

            public:

                   First(){cout << "First" << endl;};

                   ~First(){cout << "~First" <<endl;};

            };

             

            int main()

            {

                   Base *a = new First;

                   delete a;

            }

            問程序的輸出會是什么?

            結果很簡單,也就是 Base

                                           First

                               ~Base

            其它還有一個關于 & 的題目,把我搞的云里霧里的,還要再看些東西才知道怎么來解釋。

            posted on 2007-03-04 21:53 frank.sunny 閱讀(3379) 評論(10)  編輯 收藏 引用 所屬分類: C/C++學習和實踐

            FeedBack:
            # re: 網訊筆試歸來
            2007-03-04 23:01 | 郁郁寡歡
            第一,你的背景色太要命了,你自己看一分鐘試試!
            第二,
            ===================
            if (m_Data != NULL)
            {
            delete [] m_Data;
            m_Data = NULL;

            }
            ====================
            你同樣的代碼重復次數太多了,就不能做成一個函數嗎?

            第三,每次delete然后new,也可以做一些判斷,不用delete直接strcpy吧,不過這屬于優化了,對于筆試應該影響不大吧?  回復  更多評論
              
            # re: 網訊筆試歸來
            2007-03-04 23:09 | SmartPtr
            if (m_Data != NULL)
            {
            delete [] m_Data;
            m_Data = NULL;
            }

            ***************************************
            因為C++delete一個NULL指針是合法的。(可能編譯器delete的時候就對NULL進行了特殊處理),所以無需判斷,直接寫:
            delete [] m_Data;
            m_Data = NULL;   回復  更多評論
              
            # re: 網訊筆試歸來
            2007-03-04 23:19 | DC
            前面2個Constructor,肯定是不需要
            if (m_Data != NULL)
            {
            delete [] m_Data;
            m_Data = NULL;
            }
            而且是應該直接付值m_Data = NULL;先,否則,程序在這里會有異常!因為m_Data的初值不會為0。


            后面的String& String::operator = (const String& Str)需要判斷m_Data != NULL以判斷是否需要釋放內存。


            你現在的答案還是蠻多漏洞。  回復  更多評論
              
            # re: 網訊筆試歸來
            2007-03-05 17:01 | frank.sunny
            謝謝如上各位指點,我以后用代碼時背景改成灰色好了。

            根據大家的建議,我后來改了下代碼,改成如下方式:
            String::String(const char* m_char) :m_Data(NULL)
            {
            int m_nLength = strlen(m_char) + 1;
            m_Data = new char[m_nLength];
            strcpy(m_Data, m_char);
            }

            String::String(const String &Str) : m_Data(NULL)
            {
            int m_nLength = strlen(Str.m_Data) + 1;
            m_Data = new char[m_nLength];
            strcpy(m_Data, Str.m_Data);
            }
            個人還參考了下memcpy和strcpy的區別,也沒說哪個執行效率高些,當然能簡化就簡化,  回復  更多評論
              
            # re: 網訊筆試歸來
            2007-03-05 19:00 | tx7do
            memcpy是匯編實現的,效率還是很高的。  回復  更多評論
              
            # re: 網訊筆試歸來
            2007-03-05 21:40 | badtiger
            長見識了!謝謝各位  回復  更多評論
              
            # re: 網訊筆試歸來
            2007-03-05 22:27 | frank.sunny
            @tx7do

            的確如你所說,我也長見識了,呵呵
            謝謝你
              回復  更多評論
              
            # re: 網訊筆試歸來
            2007-03-08 17:33 | ZHua
            一同學習阿 呵呵  回復  更多評論
              
            # re: 網訊筆試歸來
            2008-10-14 18:17 | 貓貓咬
            這樣實現String類太低效了,應該一下分配出一定的空間(大于初始化的字符串長度),4字節的倍數會更好些。  回復  更多評論
              
            # re: 網訊筆試歸來
            2008-10-14 18:25 | 萬連文
            這種問題,我的答案是 copy mfc的CString,ok?  回復  更多評論
              

            常用鏈接

            留言簿(13)

            隨筆分類

            個人其它博客

            基礎知識鏈接

            最新評論

            閱讀排行榜

            評論排行榜

            国内精品久久久久影院日本| 久久99精品国产自在现线小黄鸭| 久久影院综合精品| 久久综合久久综合九色| 久久AAAA片一区二区| 久久久久这里只有精品 | 久久亚洲高清观看| 久久国产免费直播| 国内精品久久久久影院薰衣草| 日产精品久久久一区二区| 久久九九亚洲精品| 久久天天躁狠狠躁夜夜avapp| 久久综合综合久久97色| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 国产精品成人久久久| 国产成人久久777777| 久久99精品久久久久久久不卡| 中文字幕一区二区三区久久网站 | 久久夜色tv网站| 伊人久久大香线蕉av不卡| 久久精品国产99国产精品| 久久精品亚洲一区二区三区浴池| 久久精品国产亚洲AV影院| 精品久久久久久久久久久久久久久 | 欧美伊人久久大香线蕉综合| 伊人久久大香线蕉影院95| 97精品久久天干天天天按摩 | 久久综合伊人77777| 日韩亚洲欧美久久久www综合网| 狠狠精品久久久无码中文字幕 | 婷婷综合久久狠狠色99h| 久久久久人妻一区精品色| 久久精品国产欧美日韩99热| 久久男人中文字幕资源站| 精品一区二区久久久久久久网站| 久久99精品久久久久久动态图| 精品伊人久久大线蕉色首页| 久久精品中文无码资源站| 综合网日日天干夜夜久久| 天天爽天天狠久久久综合麻豆| 伊人久久精品线影院|