c++ 为什么我可以将字符串初始化为const char* 和QString,但不能初始化为QString*?

bq8i3lrv  于 2023-08-09  发布在  其他
关注(0)|答案(3)|浏览(154)

我对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++的一个相当基本的概念,我只是试图理解它。

unhi4e5o

unhi4e5o1#

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

const char* CONSIGNMENT_TAG_DONATE = "DTag";

字符串
因为"DTag"(类型为const char[5])衰减为const char*,因此赋值是有意义的。

QString CONSIGNMENT_TAG_DONATE = "DTag";


因为QString s有一个非显式的构造函数接受const char*,所以文字可以再次衰减为const char*,然后用于构造QString

QString* CONSIGNMENT_TAG_DONATE = "DTag";


这是无稽之谈,见第一段。
使用QString*而不是普通的QString很可能对您的用例没有帮助。

f8rj6qna

f8rj6qna2#

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 *-这是如何工作的?没有规则来进行这样的转换。它在概念上可能足够简单,但如果没有实际的代码来启用它,它将无法工作。

k2arahey

k2arahey3#

2023年更新:使用QStringLiteral:

QString CONSIGNMENT_TAG_DONATE = QStringLiteral("DTag");

字符串
更多详情in this answer .

相关问题