QString和std::string之间的区别

3
什么是QString和std::string的区别,为什么我不能说:
    QString name;
    std::string name1;
    name = name1;

虽然两者都是字符串。
提前感谢,对于我的英语不好表示抱歉。

5
相关:QString的目的是什么? - R Sahu
2
“虽然两者都是字符串”,您知道,我知道,编译器却不知道。对于编译器而言,这就像在说“int x = 0; std::string s; s = x;”。它根本不知道如何执行这个操作。 - Chad
4个回答

7
编译器如何推断“两者都是字符串”,并将其转换为另一个?虽然这两个类都表示字符串,但它们仍然是不同的、不相关的类。除非明确声明(如适当的转换运算符或构造函数),否则它们不能从一个类转换为另一个类,就像您不能使用简单的赋值将std::vector转换为std::list一样。QString具有一个名为fromStdString的静态方法,可以为您工作:
name = QString.fromStdString(name1);

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

6
与C#,Java和其他语言不同,在C ++语言中没有本地字符串类型。当您在源代码中键入字符串文字(例如“abc”)时,编译器将它们转换为具有结尾为零的元素(形成众所周知的“零终止字符串”值)的char类型数组。
为了使开发人员的生活更加轻松,C++包括用于字符串的标准库类(std::string),但这只是用于处理以零结尾的字符数组的一个实现。QString是另一个实现。当然,还有成百上千个由开发人员编写的适合其自身需求的实现。
因此,您不能直接从一个变量赋值给另一个变量,因为它们是完全不同的类型 - 编译器不知道两者都用于操作字符串 - 它只将它们视为单独且不兼容的类。

在Java中,String不是本地类型。规范也没有使用“本地类型”这个表达式。有“原始类型”和“引用类型”,String属于后者。但是,文字和运算符重载的特殊处理使该类型变得特殊。 - Christian Hackl
@ChristianHackl 你的论点同样适用于C#,其中string只是System.String引用类型的强制别名。重点只是要表明其他语言会特别支持字符串作为它们自己的类型,而C/C++则将它们转换为数组。 - adelphus
2
我不同意这种解释。对我来说,std::string 是标准库的一部分,因此与其 Java 或 C# 的对应项(如果不计算独立实现)一样是 C++ 语言的一部分。无论是 import java.lang.String 还是 #include <string> 都没有关系。在 Java 或 C# 中,人们也可以编写基于 char[] 的自定义字符串类;只是这样一个类的无用性在这些语言中更加明显。 - Christian Hackl
1
@ChristianHackl 没问题。我的观点是,在C++中,“abc”是一个char[]类型,在C#和Java中则是一个String类型。是的,你可以为C#和Java编写自己的基于char[]的类,但你必须先将字面量从String类型转换!无论如何,我认为我们只是从不同的角度看待同一个想法。 - adelphus

3
它们的区别在于它们是不同的。除非 QString 的设计者提供了一个接受 const std::string & 参数的赋值运算符,但他们并没有这样做。
要从 std::string 获取 QString,您需要使用 QString::fromStdString,并且假定转换时 std::string 是以 UTF-8 编码的。您不能盲目地假设这是有效的:您必须了解您的 std::string 来自何处以及其所采用的编码方式。
您不能将一个变量赋给另一个变量,因为这不是一项廉价的操作,并且您需要提供有关至少 std::string 中使用的编码的一些信息。请记住,QString 存储 UTF-16 Unicode 代码单元。它不直接存储 Unicode 字符,而 QChar 真正的含义是错称:它不是字符,而是 UTF-16 代码单元(不是代码点)。有时,当字符恰好具有单单元的 UTF-16 编码时,情况会“很好”,但这只是一个巧合。 std::string 更糟:它不知道它的编码方式,它只是一些字符的向量。它在许多应用程序中几乎无用,这些应用程序实际上关心这些字符的含义。

1

QString是Qt框架自己实现的字符串库,而std::string是随其他C/C++库一起捆绑提供的字符串实现库,例如iostream、stdio等。 您可以在这里进一步了解QString


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接