为什么我可以将字符串文字初始化为const char*和QString,而不是QString*

Why can I initialize string literal as const char* and QString but not QString*?

本文关键字:QString char const 我可以 字符串 文字 初始化 为什么      更新时间:2023-10-16

我对qt和C++还比较陌生,我很难理解为什么我可以在头文件中声明以下内容:

const char* CONSIGNMENT_TAG_DONATE = "DTag";

QString CONSIGNMENT_TAG_DONATE = "DTag";

const QString CONSIGNMENT_TAG_DONATE = "DTag";

但是当我尝试使用QString*时

QString* CONSIGNMENT_TAG_DONATE = "DTag";

const QString* CONSIGNMENT_TAG_DONATE = "DTag";

我在说cannot initialize a member subobject of type 'QString*' with an lvalue of type 'const char[5]'时出错。我的理解是字符串文字是const char*类型的,所以我明白为什么它有效。但是为什么分配给QString是有效的,而QString*是无效的呢?我相信这是C++的一个相当基本的概念,我只是想理解它。

QString*是指向QString的指针。这意味着它可以保存QString对象的地址。您不能(或者至少在大多数情况下不应该)将非QString的地址存储在QString*中。

const char* CONSIGNMENT_TAG_DONATE = "DTag";

工作是因为"DTag"(类型为const char[5])衰减为const char*,因此分配是有意义的。

QString CONSIGNMENT_TAG_DONATE = "DTag";

之所以有效,是因为QString有一个采用const char*的非显式构造函数,因此文字可以再次衰减为const char*,然后用于构造QString

QString* CONSIGNMENT_TAG_DONATE = "DTag";

只是胡说八道,见第一段。

使用QString*而不是普通的QString很可能对您的用例没有帮助。

C++不知道如何将char数组转换为指向QString的指针。

const char* CONSIGNMENT_TAG_DONATE = "DTag";

const char *的常量字符数组-允许

QString CONSIGNMENT_TAG_DONATE = "DTag";

使用QString::QString(const char *str)构造函数的隐式转换

QString* CONSIGNMENT_TAG_DONATE = "DTag";

常量字符数组到QString *-这是如何工作的?没有进行这种转换的规则。它在概念上可能足够简单,但如果没有实际的代码来启用它,它将无法工作。

2023年更新:使用QStringLiteral:

QString CONSIGNMENT_TAG_DONATE = QStringLiteral("DTag");

这个答案中有更多的细节。