C++ QString和std::string之间的差异

C++ QString和std::string之间的差异,c++,qt,qt-creator,C++,Qt,Qt Creator,QString和std::string之间有什么区别 为什么我不能说: QString name; std::string name1; name = name1; 虽然两者都是弦 提前感谢并为我糟糕的英语道歉QString是Qt框架自己的字符串库实现,而std::string是字符串实现,它与其他C/C++库(如iostream、stdio等)捆绑在一起。 您可以进一步阅读QString编译器如何推断“两者都是字符串”以及如何将两者转换为另一个 虽然这两个类都表示字符

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

    QString name;
    std::string name1;
    name = name1;
虽然两者都是弦


提前感谢并为我糟糕的英语道歉

QString
是Qt框架自己的字符串库实现,而
std::string
是字符串实现,它与其他C/C++库(如
iostream
、stdio等)捆绑在一起。
您可以进一步阅读
QString
编译器如何推断“两者都是字符串”以及如何将两者转换为另一个

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

QString
有一个静态方法
fromStdString
,它可以为您工作:

name = QString.fromStdString(name1);
<>注意,<>代码> STD::String 包含UTF-8数据。

< P>不同于C++、java和其他语言,C++语言< <强> > >强> >当您在源代码中键入字符串文字(如
“abc”
)时,编译器会将它们转换为字符类型的数组,末尾有一个零值元素(形成众所周知的“以零结尾的字符串”值)

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


因此,不能直接从一个类分配到另一个类的原因是它们是完全不同的类型-编译器不知道两者都用于处理字符串-它只是将它们视为独立的、不兼容的类。

不同之处在于它们是不同的。除非
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
更糟糕:它对编码一无所知,它只是一些字符的向量。这使得它在许多应用程序中几乎毫无用处,因为在这些应用程序中,您实际上关心这些字符的含义。

相关:“…虽然两者都是字符串…”您知道,我现在知道,编译器没有。对于编译器,这与说
intx=0是一样的;std::字符串s;s=x它就是不知道怎么做。
String
在Java中不是本机类型。该规范无论如何都不使用表达式“本机类型”。有“基元类型”和“引用类型”<代码>字符串
属于后一类。但是,对文字和运算符重载的特殊处理确实使类型变得特殊。@ChristianHackl您的参数与C#相同,其中string只是System.string引用类型的强制别名。这仅仅是为了表明其他语言特别努力支持字符串作为自己的类型,而C/C++将其转换为数组。我不同意这种解释。对我来说, STD::String 是标准库的一部分,因此C++语言的一部分恰好与java或C语言对应(如果不计算独立的实现)。无论是
导入java.lang.String
还是
#include
都无关紧要。你也可以用Java或C编写自己的基于
char[]
的自定义字符串类;只是在这些语言中,这样一个类的无用性会更加明显。@ChristianHackl,没关系。我的论点是,“abc”是C++中的<代码> char [/]>和代码< >代码>字符串> <代码> java。是的,您可以为C#和Java编写自己的基于
char[]
的类,但是您必须首先转换字符串类型的文本!无论如何,我认为我们只是从不同的角度看待同一个想法。