關於“函數返回CStringArray的問題”的說明
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++返回數組對象時是要進行複製操作,這非常的消耗時間和調用堆棧!