C程序员的注意事项
由于C++的类型系统和QString是隐含共享的事实,QString也许会被看做整型或者其它简单基本类型。例如:
QString boolToString( bool b ) { QString result; if ( b ) result = "True"; else result = "False"; return result; }
变量result是一个分配在栈中的自动变量。当return被调用时,因为我们正在返回值,复制构造函数被调用并且这个字符串的一个复制被返回。(我们要感谢隐含共享,没有实际的复制发生,请看下面。)
在Qt的源代码中,你将会遇到想这样的QString的用法:
QString func( const QString& input ) { QString output = input; // 处理输出 return output; }
从input到output的“复制”几乎和复制指针一样快,因为后面的场景复制是通过增加引用计数器来实现的。QString操作是基于写时复制的,只有在实例发生实际改变时,才会被复制。
如果你想不丢失任何Unicode信息的情况下创建一个QString的深度复制,那么你应该使用QString中用QChar*作为参数的构造函数。例如:
QString a("abcd"); QString b( a.unicode(), b.length() );
另外,使用QString中用const char*参数的构造函数就足够了。例如:
QString a("abcd"); QString b( a.latin1() );
也可以参考QChar、QCString、QByteArray、QConstString、隐含和明显共享类、文本相关类和非图形用户界面类。