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

时间:2016-04-11 17:01:53

标签: c++ qt c++11

我对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 ++概念,我只是想了解它。

2 个答案:

答案 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";的常量字符数组 - 这是如何工作的?没有规则可以进行这样的转换。它在概念上可能很简单,但如果没有实际的代码来启用它,它将无法工作。