• <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的個(gè)人技術(shù)空間
            獲得人生中的成功需要的專注與堅(jiān)持不懈多過(guò)天才與機(jī)會(huì)。 ——C.W. Wendte

            網(wǎng)訊筆試歸來(lái)

            昨天去網(wǎng)訊(杭州)筆試了,做了下筆試題,感覺(jué)題目都不難,但是自己做的的確不怎么樣,估計(jì)是沒(méi)機(jī)會(huì)去了,不過(guò)暫時(shí)還是先把幾道自己還記得的題目,寫出來(lái),總結(jié)下,以做復(fù)習(xí)。

            1、  要求自己實(shí)現(xiàn) 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;

            };

             

            關(guān)于 String 類的筆試題,以前看林銳的隨筆時(shí)聽(tīng)說(shuō)他在微軟面試時(shí)曾碰到那么一道題目,我自己也沒(méi)有真的下筆去做過(guò),平常都是拿來(lái)就用的,這次自己碰到,才知道會(huì)死得那么慘,反正編得不堪入目(我就不拿出來(lái)獻(xiàn)丑了),下面是我回來(lái)后,自己重新寫的答案。

            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;// 以前真的不知道,原來(lái)對(duì)象的私有變量

            // 在類的實(shí)現(xiàn)代碼中也是可以訪問(wèn)的

                   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、  關(guān)于內(nèi)存分配

            這個(gè)題目很簡(jiǎn)單,就給了一個(gè)函數(shù),然后問(wèn)函數(shù)內(nèi)的局部變量存放在哪里,我也不知道為什么當(dāng)時(shí)會(huì)選擇 heap( ) ,下面再把幾個(gè)概念羅列出來(lái):

            1.            堆區(qū)( heap ):由程序員申請(qǐng)分配和釋放,屬動(dòng)態(tài)內(nèi)存分配方式,若程序員不釋放,程序結(jié)束時(shí)可能會(huì)由 OS 回收。不過(guò)這個(gè)內(nèi)存分配很容易引起問(wèn)題,如果申請(qǐng)的內(nèi)存不釋放就會(huì)造成內(nèi)存泄漏;如果釋放的不是所要釋放的內(nèi)存,則輕者引起程序運(yùn)行結(jié)果出錯(cuò),重者系統(tǒng)崩潰。

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

            3.            全局區(qū)(靜態(tài)區(qū))( static ):全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,而且初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)釋放,所以也不會(huì)造成內(nèi)存問(wèn)題。

            除了以上的變量外,還有兩類存放位置,文字常量區(qū)和程序代碼區(qū),兩者都是由系統(tǒng)分配和釋放,且文字常量區(qū)和前面三區(qū)合成為程序數(shù)據(jù)區(qū),與程序代碼區(qū)相對(duì)應(yīng)。

            3、  關(guān)于類繼承的構(gòu)造和析構(gòu)函數(shù)

            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;

            }

            問(wèn)程序的輸出會(huì)是什么?

            結(jié)果很簡(jiǎn)單,也就是 Base

                                           First

                               ~Base

            其它還有一個(gè)關(guān)于 & 的題目,把我搞的云里霧里的,還要再看些東西才知道怎么來(lái)解釋。

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

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

            }
            ====================
            你同樣的代碼重復(fù)次數(shù)太多了,就不能做成一個(gè)函數(shù)嗎?

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

            ***************************************
            因?yàn)镃++delete一個(gè)NULL指針是合法的。(可能編譯器delete的時(shí)候就對(duì)NULL進(jìn)行了特殊處理),所以無(wú)需判斷,直接寫:
            delete [] m_Data;
            m_Data = NULL;   回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2007-03-04 23:19 | DC
            前面2個(gè)Constructor,肯定是不需要
            if (m_Data != NULL)
            {
            delete [] m_Data;
            m_Data = NULL;
            }
            而且是應(yīng)該直接付值m_Data = NULL;先,否則,程序在這里會(huì)有異常!因?yàn)閙_Data的初值不會(huì)為0。


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


            你現(xiàn)在的答案還是蠻多漏洞。  回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2007-03-05 17:01 | frank.sunny
            謝謝如上各位指點(diǎn),我以后用代碼時(shí)背景改成灰色好了。

            根據(jù)大家的建議,我后來(lái)改了下代碼,改成如下方式:
            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);
            }
            個(gè)人還參考了下memcpy和strcpy的區(qū)別,也沒(méi)說(shuō)哪個(gè)執(zhí)行效率高些,當(dāng)然能簡(jiǎn)化就簡(jiǎn)化,  回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2007-03-05 19:00 | tx7do
            memcpy是匯編實(shí)現(xiàn)的,效率還是很高的。  回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2007-03-05 21:40 | badtiger
            長(zhǎng)見(jiàn)識(shí)了!謝謝各位  回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2007-03-05 22:27 | frank.sunny
            @tx7do

            的確如你所說(shuō),我也長(zhǎng)見(jiàn)識(shí)了,呵呵
            謝謝你
              回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2007-03-08 17:33 | ZHua
            一同學(xué)習(xí)阿 呵呵  回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2008-10-14 18:17 | 貓貓咬
            這樣實(shí)現(xiàn)String類太低效了,應(yīng)該一下分配出一定的空間(大于初始化的字符串長(zhǎng)度),4字節(jié)的倍數(shù)會(huì)更好些。  回復(fù)  更多評(píng)論
              
            # re: 網(wǎng)訊筆試歸來(lái)
            2008-10-14 18:25 | 萬(wàn)連文
            這種問(wèn)題,我的答案是 copy mfc的CString,ok?  回復(fù)  更多評(píng)論
              

            常用鏈接

            留言簿(13)

            隨筆分類

            個(gè)人其它博客

            基礎(chǔ)知識(shí)鏈接

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲色大成网站WWW久久九九| 午夜人妻久久久久久久久| 久久精品国产亚洲AV无码偷窥| 四虎亚洲国产成人久久精品| 久久精品免费观看| 国产韩国精品一区二区三区久久| 亚洲成色www久久网站夜月| 亚洲精品无码久久久影院相关影片 | www亚洲欲色成人久久精品| 99久久99这里只有免费的精品| 久久青青草原精品国产| 久久亚洲精品成人av无码网站| 漂亮人妻被黑人久久精品| 久久精品国产亚洲77777| 2021精品国产综合久久| 久久青青草原精品影院| 久久国产香蕉一区精品| 亚洲国产天堂久久久久久| 综合久久一区二区三区| 亚洲欧美日韩中文久久| 精品国产乱码久久久久久郑州公司| www久久久天天com| 久久综合狠狠综合久久激情 | 久久久久亚洲av成人无码电影 | 99久久综合国产精品二区| 国产亚洲成人久久| 2021国内久久精品| 麻豆亚洲AV永久无码精品久久| 久久精品国产99久久无毒不卡 | 久久久久亚洲AV无码专区桃色| 久久笫一福利免费导航 | 亚洲国产精品婷婷久久| 亚洲欧美成人久久综合中文网| 久久九九久精品国产免费直播| 久久精品无码午夜福利理论片 | 久久久久国产一区二区三区| 亚洲婷婷国产精品电影人久久| 无码人妻久久一区二区三区免费丨| 久久亚洲国产欧洲精品一| 亚洲国产精品无码久久久久久曰| 亚洲精品乱码久久久久久蜜桃图片|