关于“函数返回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++返回数组对象时是要进行复制操作,这非常的消耗时间和调用堆栈!

展开阅读全文

没有更多推荐了,返回首页