我对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 ++概念,我只是想了解它。
答案 0 :(得分:7)
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
。< / p>
QString* CONSIGNMENT_TAG_DONATE = "DTag";
只是废话,请参阅第一段。
使用QString*
代替普通QString
很可能对您的用例没有帮助。
答案 1 :(得分:1)
C ++不知道如何将char数组转换为指向channel.clearValue();
的指针。
QString
const char* CONSIGNMENT_TAG_DONATE = "DTag";
的常量字符数组 - 允许
const char *
使用QString CONSIGNMENT_TAG_DONATE = "DTag";
构造函数
QString::QString(const char *str)
QString* CONSIGNMENT_TAG_DONATE = "DTag";
的常量字符数组 - 这是如何工作的?没有规则可以进行这样的转换。它在概念上可能很简单,但如果没有实际的代码来启用它,它将无法工作。