空字符串在构造函数中被解释为bool
Empty string is interpreted as bool in Constructor
我正在做一个QT项目,发现了一个奇怪的行为:
我有一个类的几个构造函数看起来像
DB_Variable(QString name, QString newValue):
name(name),value_string(newValue), var_type(DB_STRING){}
DB_Variable(QString name, bool newValue):
name(name), value_bool(newValue), var_type(DB_BOOL){}
我现在想使用第一个构造函数来创建一个对象,像这样:
DB_Variable foo("some_name"," ");
我希望空字符串被解释为QString,但是调用了第二个(bool)构造函数。有人能告诉我为什么吗?"是一个指针指向一个空字符串,然后在某种程度上,而不是一个bool字符串?
Foo这个问题是由于在构造函数中进行隐式转换造成的。字符串字面值(例如代码中的字面值)存储为const char
类型。因为没有采用此类型的构造函数,所以编译器会尝试在构造函数中找到可以找到的类型的转换。
在这种情况下,const char*
比QString
更容易转换为bool
,所以当您这样做时:
DB_Variable foo("some_name"," ");
构造函数
DB_Variable(QString name, bool newValue):
。
请注意,您所看到的行为不是由于" "
与任何其他字符串文字的处理方式不同,只是您很可能没有bool, bool
类型的构造函数(是否所有构造函数都将QString
作为第一个参数?)。如果您有如下构造函数:
DB_Variable(bool test1, bool newValue):
那么当您执行诸如DB_Variable foo("some_name"," ");
要得到你想要的结果,你可以像这样传入QStrings
:
DB_Variable foo(QString("some_name"), QString());
或者定义一个构造函数,将const char*
作为第二个形参
字符串" "
只是一个char*
。与使用用户定义的转换到QString
相比,它更容易转换到bool
。
我希望空字符串被解释为QString,但是调用了第二个(bool)构造函数。有人能告诉我为什么吗?
" "
从char[2]
衰减到char*
,然后作为指针转换为int型,作为int型转换为bool型。
我不是很熟悉Qt,但如果QString
的构造函数(需要一个char[N]或char*参数)是显式的,那么当您编写时,您将只参与第一个构造函数:
DB_Variable foo("some_name", QString{ " " });
// HERE: ^^^^^^^^ ^
最简单的解决方案是向DB_Variable类添加第三个构造函数。您可以通过多种方式做到这一点,但是如果您希望将一个空值(默认情况下)设置为" "
,则应该编写类似于以下的代码:
DB_Variable(QString name):
name(name),value_string(" "), var_type(DB_STRING){}
客户机代码:DB_Variable foo("some_name"); // create variable with empty value (actually " " value)
- 写入向量<向量<bool>>
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 内联程序集printf将整数解释为地址
- 有人能解释一下为什么下界是这样工作的吗C++的
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 有人能为我解释一下C++代码吗
- 让bool方法返回其他整数
- 你能解释一下什么运行时错误是如何解决它的吗?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- 有人可以向我解释为什么控制台输出 0 吗?
- 有人可以解释一下这段代码如何能够反转字符串
- Arduino-C++ bool 不会从 false 变为 true
- 重新解释cast<是否安全;bool*>清空内存
- 空字符串在构造函数中被解释为bool