我对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++的一个相当基本的概念,我只是试图理解它。
3条答案
按热度按时间unhi4e5o1#
QString*
是指向QString
的指针。这意味着它可以保存QString
对象的地址。您不能(或者至少在大多数情况下不应该)在QString*
中存储非QString
的地址。字符串
因为
"DTag"
(类型为const char[5]
)衰减为const char*
,因此赋值是有意义的。型
因为
QString
s有一个非显式的构造函数接受const char*
,所以文字可以再次衰减为const char*
,然后用于构造QString
。型
这是无稽之谈,见第一段。
使用
QString*
而不是普通的QString
很可能对您的用例没有帮助。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 *
-这是如何工作的?没有规则来进行这样的转换。它在概念上可能足够简单,但如果没有实际的代码来启用它,它将无法工作。k2arahey3#
2023年更新:使用QStringLiteral:
字符串
更多详情in this answer .