遇到的问题:函数要返回一个字符串,怎么实现比较好?
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对象时,是复制整个对象吗?一般情况下这样的函数该怎么实现?谢谢!
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对象时,是复制整个对象吗?一般情况下这样的函数该怎么实现?谢谢!
这种情况也不需要new
不过最好返回CString,因为有返回值优化
====>
CString str1 = "111";
CString str2 = str1;
CString str3 = str1;
CString是通过引用计数来控制数据的,上面的三行代码实际上只分配了一个对象的空间,str2和str3指向str1相同的地方,并不会产生对象复制。
明显内存泄漏
bool class1::fun1(CString &str)
{
...
return true;
}
分两种:
一种是在系统堆上的,返回类型为char*,不需要你维护空间,例如asctime;
一种是在程序栈上,需要你维护空间,返回类型可以为CString或char*,如果是CString,你就直接将CString的内容sprintf过来即可,如果是动态开辟的空间,那么使用后delete []掉即可。
返回值为CString类型,肯定是效率低,因为函数返回时要创建一个CString的拷贝,返回后又要释放掉。我想,除了嵌入式系统里更需要考虑系统效率,WIN32编程中你大可不必考虑哪种效率更高。2.非临时字符串
比如,字符串的内容存储在类型为char*或char[]的类成员变量或全局变量中,你只需要返回char*即可。
楼上有几位可能没看到我这句注释,在析构函数中我要delete,先不考虑内存泄漏。而且函数中的字符串要动态创建,也就是在程序运行期才能确定是否建立一个CString对象。我之所以使用CString类,而不用char*是因为我想使用CString类中的str+="aa"这个操作,如果用char*完成这个动作会很麻烦。这一点我忘记说明了。不过现在看了大家的回复,有了一点灵感:可以调用函数中建立一个CString对象,在被调函数输入参数中加一个CString的变量的引用,正如ylmszhanghua所说。或者对CString对象运算完成后转化为char*返回?或者?无论怎样,现在感觉返回CString*有点捌扭。
虽字符串是很基础的东西,但确实不容易搞明白。刚开始学的是Basic语言(不是VB),对字符串的操作就像字符一样;后来学了C语言就不明白为什么把字符串操作弄得这么复杂,比如比较字符串,复制字符串...都要用到函数,而不能简单地用运算符==,=等,慢慢地刚明白是怎么回事(c是比较低级的高级语言,与计算机真实操作过程接近,而Basic语言是解释性的,屏蔽了很多细节),再学C++(MFC),它又把这些运算符重载了,也就是可以用=,==对字符串操作了还需要好好学习啊!
CString str1 = str;
memcpy((void*)(const char*)str1, "olleh", 5);
printf("%s\n", (const char*)str);学习了,以前一直不知道CString这么智能,测试了一下果然如此。
以前还觉得返回一个CString比较浪费,现在看来可以大胆的返回CString了。
我要在一个类中保存若干字符串,字符串的长度和个数都不确定,所以准备在成员变量中建立一个字符串链表,以上说的其实都是建立这个链表的问题。
而我还要添加一个成员函数GetStr()去获取链表中的某一个字符串,那么这个函数该返回CString类型?还是有更好的方法?也许在Windows中不用太考虑效率,但作为一个初学者还是想知道好的编程风格,谢谢!