遇到的问题:函数要返回一个字符串,怎么实现比较好?
C语言中,可以返回一个char*的指针,或传入一个char*的参数,都可以吧。但是在c++中使用MFC编程,有一个CString类,开始仿照C语言的方法让函数返回一个CString*的指针,目的是提高效率(返回对象的指针总比返回对象本身快吧):
CString *class1::fun1()          //此函数需要动态生成一些字符串,析构函数中释放这些字符串
{
  CString *str=new CString;
    ...
    return str;
}class2::fun()
{
   class1 obj;
   if(_T("string1")==*obj.fun1())
      ...
}
    这样是没有问题的,已经成功。但是后来知道CString类用了"写时复制"和"引用计数"的概念,我是一个初学者,对这些概念理解不深,但隐约感觉到函数直接返回CString对象更好?效率会更高?所以请教大家:
  函数返回CString对象时,是复制整个对象吗?一般情况下这样的函数该怎么实现?谢谢!

解决方案 »

  1.   

    你应该返回CString,而不是CString*
    这种情况也不需要new
      

  2.   

    你的做法是可以的
    不过最好返回CString,因为有返回值优化
      

  3.   

    C++中也可以返回简单的char *.函数返回CString对象时,是复制整个对象吗?一般情况下这样的函数该怎么实现?谢谢!
    ====>
    CString str1 = "111";
    CString str2 = str1;
    CString str3 = str1;
    CString是通过引用计数来控制数据的,上面的三行代码实际上只分配了一个对象的空间,str2和str3指向str1相同的地方,并不会产生对象复制。
      

  4.   

    可以吗?他可没delete哦
    明显内存泄漏
      

  5.   

    你可以用引用啊。。在输入参数中加一个CString的变量的引用。
    bool class1::fun1(CString &str)          

       
        ... 
        return true; 
      

  6.   

    你要是想返回指针,直接char *也可以啊!!
      

  7.   

    返回字符串的一般做法有几种:1.临时字符串
    分两种:
    一种是在系统堆上的,返回类型为char*,不需要你维护空间,例如asctime;
    一种是在程序栈上,需要你维护空间,返回类型可以为CString或char*,如果是CString,你就直接将CString的内容sprintf过来即可,如果是动态开辟的空间,那么使用后delete []掉即可。
    返回值为CString类型,肯定是效率低,因为函数返回时要创建一个CString的拷贝,返回后又要释放掉。我想,除了嵌入式系统里更需要考虑系统效率,WIN32编程中你大可不必考虑哪种效率更高。2.非临时字符串
    比如,字符串的内容存储在类型为char*或char[]的类成员变量或全局变量中,你只需要返回char*即可。
      

  8.   

    用CString和CString*都可以。如果用CString,是在栈中分配临时变量,被调函数返回时执行拷贝构造,自动析构和释放空间;如果用CString*,在被调函数中用new来分配,不使用时自己delete释放。此外还可以通过CString&型参数来传递字符串。
      

  9.   

    //此函数需要动态生成一些字符串,析构函数中释放这些字符串
    楼上有几位可能没看到我这句注释,在析构函数中我要delete,先不考虑内存泄漏。而且函数中的字符串要动态创建,也就是在程序运行期才能确定是否建立一个CString对象。我之所以使用CString类,而不用char*是因为我想使用CString类中的str+="aa"这个操作,如果用char*完成这个动作会很麻烦。这一点我忘记说明了。不过现在看了大家的回复,有了一点灵感:可以调用函数中建立一个CString对象,在被调函数输入参数中加一个CString的变量的引用,正如ylmszhanghua所说。或者对CString对象运算完成后转化为char*返回?或者?无论怎样,现在感觉返回CString*有点捌扭。
    虽字符串是很基础的东西,但确实不容易搞明白。刚开始学的是Basic语言(不是VB),对字符串的操作就像字符一样;后来学了C语言就不明白为什么把字符串操作弄得这么复杂,比如比较字符串,复制字符串...都要用到函数,而不能简单地用运算符==,=等,慢慢地刚明白是怎么回事(c是比较低级的高级语言,与计算机真实操作过程接近,而Basic语言是解释性的,屏蔽了很多细节),再学C++(MFC),它又把这些运算符重载了,也就是可以用=,==对字符串操作了还需要好好学习啊!
      

  10.   

    CString str = "hello world!";
    CString str1 = str;
    memcpy((void*)(const char*)str1, "olleh", 5);
    printf("%s\n", (const char*)str);学习了,以前一直不知道CString这么智能,测试了一下果然如此。
    以前还觉得返回一个CString比较浪费,现在看来可以大胆的返回CString了。
      

  11.   

    问题补充:
    我要在一个类中保存若干字符串,字符串的长度和个数都不确定,所以准备在成员变量中建立一个字符串链表,以上说的其实都是建立这个链表的问题。
    而我还要添加一个成员函数GetStr()去获取链表中的某一个字符串,那么这个函数该返回CString类型?还是有更好的方法?也许在Windows中不用太考虑效率,但作为一个初学者还是想知道好的编程风格,谢谢!
      

  12.   

    返回函数中的局部 变量的指针 毫无意义,返回CString 能成功是因为 CString 存在 拷贝构造函数