QString和std :: string之间的区别

时间:2015-08-06 16:23:26

标签: c++ qt qt-creator

QString和std :: string之间的区别是什么 为什么我不能说:

    QString name;
    std::string name1;
    name = name1;

虽然两者都是字符串

提前致谢并抱歉我的英文不好

4 个答案:

答案 0 :(得分:5)

编译器如何推断“两者都是字符串”以及如何将一个转换为另一个?

虽然这两个类都代表字符串,但它们仍然是不同的,不相关的类。除非明确说明(如适当的转换运算符或构造函数),否则它们不能从一个转换为另一个,就像您不能使用简单赋值将std::vector<int>转换为std::list<int>一样。

QString有一个静态方法fromStdString可以为你效用:

name = QString.fromStdString(name1);

请注意,它预示std::string包含utf-8数据。

答案 1 :(得分:4)

与C#,Java和其他语言不同,C ++语言中没有本机字符串类型。当您在源代码中键入"abc"之类的字符串文字时,编译器会将它们转换为 char 类型的数组,并在末尾添加零值元素(形成众所周知的&#39;零终止字符串&#39; 值);

为了让开发人员的生活更轻松,C ++包含了一个用于字符串的标准库类(std :: string),但这只是一个用于处理零终止字符数组的实现。 QString是另一种实现。当然,还有数百种由开发人员编写,以满足他们自己的需求。

所以你不能直接从一个分配到另一个的原因是它们是完全不同的类型 - 编译器不知道它们都用于操作字符串 - 它只是将它们视为单独的,不兼容的课程。

答案 2 :(得分:2)

不同之处在于它们是完全不同的。除非QString的设计者提供了一个赋值运算符的const std::string &参数,并且他们没有这样做。

要从QString获取std::string,您需要使用QString::fromStdString,并且假设std::string是UTF-8编码,转换完成。您不能盲目地认为这是一个有效的假设:您必须了解std::string来自哪里以及它的编码方式。

您不能将一个分配给另一个,因为它不是一个便宜的操作,并且您需要至少提供一些有关{{{{ 1}}。回想一下std::string存储UTF-16 Unicode代码单元。它不直接存储Unicode字符,而QString实际上是用词不当:它不是字符,而是UTF-16代码单元(不是代码点)。有时候,当一个角色恰好采用单一单位UTF-16编码时,事情会很好地解决,但这只是巧合。

QChar更糟糕:它对编码一无所知,它只是一些字符的向量。它使得它在许多应用程序中几乎无用,在这些应用程序中,您实际上关心这些字符的含义。

答案 3 :(得分:1)

QString是Qt框架自己的Strings库实现,而std :: string是Strings的实现,它与其他C / C ++库捆绑在一起,如iostream,stdio等。 您可以进一步阅读QString here