为什么我可以将字符串文字初始化为const char*和QString,而不是QString*
Why can I initialize string literal as const char* and QString but not QString*?
我对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
很可能对您的用例没有帮助。
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");
这个答案中有更多的细节。
- 将 Qvector<uint8_t> 转换为 QString
- 为char数组调整zlib-zpipe
- 使用strcpy将char数组的元素复制到另一个数组
- 为什么 Serial.println(<char[]>);返回随机字符?
- 如何阻止反斜杠在从 QString 到 char 数组的转换中取消?
- QT中不允许使用一行多个转换,例如qString到char*
- 无法将 QString 转换为 Const Char*
- QString 到 const char* 的不同结果
- 将char*传递到QString
- Qt char* to QString
- 为什么我可以将字符串文字初始化为const char*和QString,而不是QString*
- QString to char*
- 将单个字符QString强制转换为Char
- 将QString转换为char*(不是const char*!!!)的干净方法
- QString到std::string到const char*的转换在赋值中不起作用
- 将QString转换为const-char*时的不可预测的运行时行为
- 从QString到char指针的转换生成空字符串
- 将char[]转换为Qstring,添加额外的3个字符
- QString to Const Char*
- 通过c风格转换将char*转换为QString