關於“函數返回CStringArray的問題”的說明

關於“函數返回CStringArray的問題”的說明

LYONS
      VC++ 5.0 
      WIN95 
      本人在用VC++ 5.0 開發一應用程序時遇到如下問題: 
      從CStdioFile 類派生CSearch 類: 
       class CSearch : public CStdioFile 
      其中一個成員函數SearchNode如下: 
       CStringArray CSearch::SearchNode(CString csDesiPin) 
       { 
       CStringArray a; 
       a.Add("test"); 
       return a; 
       } 
      編譯時產生如下錯誤: 
       error C2558: 'CStringArray::CStringArray' : no copy constructor available 
      查看錯誤說明和在線幫助後仍不能解決。

回答:

      對於直接返回類的函數,該返回類型的類必須要有copy constructor(拷貝構造函數)。 
     
      例如 先定義了 class A; 
      若有一函數, 其返回值類型是 A, 
       A f1(){ 
       A var1; 
       .... 
       return var1; 
       } 
     
      則當使用該函數時, 
       A b; 
       b=f1(); 
      其過程是, 
       1,當f1執行返回時,先產生一個臨時變量 
       2,將要返回的值 var1 拷貝到 臨時變量中。因爲一旦 f1 執行完,var1 將被析構。 
       3,變量b再調用賦值操作將臨時變量中的值賦給b。 
       4,臨時變量被析構。 
      其中第2步需要拷貝構造函數。臨時變量的構造和析構過程都由編譯器自動完成。 
      (有關臨時變量,請看 HELP,Key Word, Temporary Objects) 
     
      本來拷貝構造函數總是存在的,即使沒有顯式定義,編譯器也會自動生成一個。但只要用戶顯示定義了任何 
      一種構造函數,編譯器就不會自動生成拷貝構造函數。 
      (請看 HELP,Key Word, C2558) 
     
      查看 CStringArray 的 help 及由 VC5 提供的源程序,都可知已經定義了 構造函數 CStringArray(), 因此 
      拷貝構造函數不會被自動生成。 
     
      建議修改辦法如下: 
       法1, 
       void CSearch::SearchNode(CString csDesiPin, CStringArray &a) 
       { 
       a.Add("test"); 
       } 
       法2,由CStringArray派生CStringArray1,並增加拷貝構造函數。 
     
       CStringArray1 CSearch::SearchNode(CString csDesiPin) 
       { 
       CStringArray1 a; 
       a.Add("test"); 
       return a; 
       }


文章鏈接:http://www.quke.org/post-78.html 

注:將對象作爲函數的返回值是,在return 對象後,會調用該對象的拷貝構造函數,重新創建一個臨時的該類型的對象,如再將該返回值複製給某個變量,這有會調用該對象的拷貝構造函數,而此處CStringArrary只有無參的構造函數,沒有拷貝構造函數,所不能將該對象作爲返回值,另一方面在C++返回數組對象時是要進行複製操作,這非常的消耗時間和調用堆棧!

發佈了7 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章