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() );


也可以参考QCharQCStringQByteArrayQConstString隐含和明显共享类文本相关类非图形用户界面类