在线现看午夜福利片|女人16久久免费视频|鲁丝片一区鲁丝片二区鲁丝|一区二区三区欧美在线

  1. 
    
    <b id="glvx9"></b>
        1. <blockquote id="glvx9"><meter id="glvx9"></meter></blockquote>
            首頁(yè) - 網(wǎng)校 - 萬(wàn)題庫(kù) - 美好明天 - 直播 - 導(dǎo)航
            您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 模擬試題 > 正文

            計(jì)算機(jī)軟件水平考試《程序員》面試題精選題(5)

            來(lái)源:考試吧 2017-10-18 11:58:46 要考試,上考試吧! 萬(wàn)題庫(kù)
            “計(jì)算機(jī)軟件水平考試《程序員》面試題精選題(5)”供考生參考。更多軟件水平考試內(nèi)容請(qǐng)?jiān)L問考試吧軟件水平考試網(wǎng)。

              -含有指針成員的類的拷貝

              題目:下面是一個(gè)數(shù)組類的聲明與實(shí)現(xiàn)。請(qǐng)分析這個(gè)類有什么問題,并針對(duì)存在的問題提出幾種解決方案。

              template class Array

              {

              public:

              Array(unsigned arraySize):data(0), size(arraySize)

              {

              if(size > 0)

              data = new T[size];

              }

              ~Array()

              {

              if(data) delete[] data;

              }

              void setValue(unsigned index, const T& value)

              {

              if(index < size)

              data[index] = value;

              }

              T getValue(unsigned index) const

              {

              if(index < size)

              return data[index];

              else

              return T();

              }

              private:

              T* data;

              unsigned size;

              };

              分析:我們注意在類的內(nèi)部封裝了用來(lái)存儲(chǔ)數(shù)組數(shù)據(jù)的指針。軟件存在的大部分問題通常都可以歸結(jié)指針的不正確處理。

              這個(gè)類只提供了一個(gè)構(gòu)造函數(shù),而沒有定義構(gòu)造拷貝函數(shù)和重載拷貝運(yùn)算符函數(shù)。當(dāng)這個(gè)類的用戶按照下面的方式聲明并實(shí)例化該類的一個(gè)實(shí)例

              Array A(10);

              Array B(A);

              或者按照下面的方式把該類的一個(gè)實(shí)例賦值給另外一個(gè)實(shí)例

              Array A(10);

              Array B(10);

              B=A;

              編譯器將調(diào)用其自動(dòng)生成的構(gòu)造拷貝函數(shù)或者拷貝運(yùn)算符的重載函數(shù)。在編譯器生成的缺省的構(gòu)造拷貝函數(shù)和拷貝運(yùn)算符的重載函數(shù),對(duì)指針實(shí)行的是按位拷貝,僅僅只是拷貝指針的地址,而不會(huì)拷貝指針的內(nèi)容。因此在執(zhí)行完前面的代碼之后,A.data和B.data指向的同一地址。當(dāng)A或者B中任意一個(gè)結(jié)束其生命周期調(diào)用析構(gòu)函數(shù)時(shí),會(huì)刪除data。由于他們的data指向的是同一個(gè)地方,兩個(gè)實(shí)例的data都被刪除了。但另外一個(gè)實(shí)例并不知道它的data已經(jīng)被刪除了,當(dāng)企圖再次用它的data的時(shí)候,程序就會(huì)不可避免地崩潰。

              由于問題出現(xiàn)的根源是調(diào)用了編譯器生成的缺省構(gòu)造拷貝函數(shù)和拷貝運(yùn)算符的重載函數(shù)。一個(gè)最簡(jiǎn)單的辦法就是禁止使用這兩個(gè)函數(shù)。于是我們可以把這兩個(gè)函數(shù)聲明為私有函數(shù),如果類的用戶企圖調(diào)用這兩個(gè)函數(shù),將不能通過編譯。實(shí)現(xiàn)的代碼如下:

              private:

              Array(const Array& copy);

              const Array& operator = (const Array& copy);

              最初的代碼存在問題是因?yàn)椴煌瑢?shí)例的data指向的同一地址,刪除一個(gè)實(shí)例的data會(huì)把另外一個(gè)實(shí)例的data也同時(shí)刪除。因此我們還可以讓構(gòu)造拷貝函數(shù)或者拷貝運(yùn)算符的重載函數(shù)拷貝的不只是地址,而是數(shù)據(jù)。由于我們重新存儲(chǔ)了一份數(shù)據(jù),這樣一個(gè)實(shí)例刪除的時(shí)候,對(duì)另外一個(gè)實(shí)例沒有影響。這種思路我們稱之為深度拷貝。實(shí)現(xiàn)的代碼如下:

              public:

              Array(const Array& copy):data(0), size(copy.size)

              {

              if(size > 0)

              {

              data = new T[size];

              for(int i = 0; i < size; ++ i)

              setValue(i, copy.getValue(i));

              }

              }

              const Array& operator = (const Array& copy)

              {

              if(this == ?)

              return *this;

              if(data != NULL)

              {

              delete []data;

              data = NULL;

              }

              size = copy.size;

              if(size > 0)

              {

              data = new T[size];

              for(int i = 0; i < size; ++ i)

              setValue(i, copy.getValue(i));

              }

              }

              為了防止有多個(gè)指針指向的數(shù)據(jù)被多次刪除,我們還可以保存究竟有多少個(gè)指針指向該數(shù)據(jù)。只有當(dāng)沒有任何指針指向該數(shù)據(jù)的時(shí)候才可以被刪除。這種思路通常被稱之為引用計(jì)數(shù)技術(shù)。在構(gòu)造函數(shù)中,引用計(jì)數(shù)初始化為1;每當(dāng)把這個(gè)實(shí)例賦值給其他實(shí)例或者以參數(shù)傳給其他實(shí)例的構(gòu)造拷貝函數(shù)的時(shí)候,引用計(jì)數(shù)加1,因?yàn)檫@意味著又多了一個(gè)實(shí)例指向它的data;每次需要調(diào)用析構(gòu)函數(shù)或者需要把data賦值為其他數(shù)據(jù)的時(shí)候,引用計(jì)數(shù)要減1,因?yàn)檫@意味著指向它的data的指針少了一個(gè)。當(dāng)引用計(jì)數(shù)減少到0的時(shí)候,data已經(jīng)沒有任何實(shí)例指向它了,這個(gè)時(shí)候就可以安全地刪除。實(shí)現(xiàn)的代碼如下:

              public:

              Array(unsigned arraySize)

              :data(0), size(arraySize), count(new unsigned int)

              {

              *count = 1;

              if(size > 0)

              data = new T[size];

              }

              Array(const Array& copy)

              : size(copy.size), data(copy.data), count(copy.count)

              {

              ++ (*count);

              }

              ~Array()

              {

              Release();

              }

              const Array& operator = (const Array& copy)

              {

              if(data == copy.data)

              return *this;

              Release();

              data = copy.data;

              size = copy.size;

              count = copy.count;

              ++(*count);

              }

              private:

              void Release()

              {

              --(*count);

              if(*count == 0)

              {

              if(data)

              {

              delete []data;

              data = NULL;

              }

              delete count;

              count = 0;

              相關(guān)推薦:

              2017年計(jì)算機(jī)軟件水平考試時(shí)間公布(全年)

              各地2017年軟件水平考試準(zhǔn)考證打印/領(lǐng)取時(shí)間匯總

              考試吧特別策劃:2017年計(jì)算機(jī)軟考報(bào)考指南專題熱點(diǎn)文章

              軟考各科目模擬試題及答案各科目復(fù)習(xí)指導(dǎo)匯總

              軟考報(bào)考條件軟考報(bào)名方法考試大綱科目

              歷年軟考真題及答案匯總軟件水平考試簡(jiǎn)介

            文章搜索
            ·精選試題 ·智能練習(xí)
            ·智能評(píng)估 ·視頻解析
            掃描二維碼下載
            • 初級(jí)職稱
            • 中級(jí)職稱
            • 高級(jí)職稱

            版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
            Copyright © 2004- 考試吧軟件水平考試網(wǎng) 出版物經(jīng)營(yíng)許可證新出發(fā)京批字第直170033號(hào) 
            京ICP證060677 京ICP備05005269號(hào) 中國(guó)科學(xué)院研究生院權(quán)威支持(北京)
            在線模擬試題
            考證通關(guān)殺器
            考試最新資訊
            學(xué)
            一次通關(guān)技巧