C++ 将int作为bool参数传递到C++;
有人能解释一下这段代码中发生了什么吗: 这里的示例: 在本声明中C++ 将int作为bool参数传递到C++;,c++,pointers,constructor,boolean,implicit-conversion,C++,Pointers,Constructor,Boolean,Implicit Conversion,有人能解释一下这段代码中发生了什么吗: 这里的示例: 在本声明中 toto t = new toto(0); 类类型toto的对象t由表达式newtoto(0)返回的指针初始化。由于返回的指针不等于nullptr,因此它被隐式转换为布尔值true 所以事实上你有 toto t = true; 除了内存泄漏,因为分配对象的地址丢失。因此,无法删除已分配的对象 你可以想象上面的声明是这样的 toto *ptr = new toto(0) toto t = ptr; 所以这个输出的第一行 con
toto t = new toto(0);
类类型toto
的对象t
由表达式newtoto(0)
返回的指针初始化。由于返回的指针不等于nullptr
,因此它被隐式转换为布尔值true
所以事实上你有
toto t = true;
除了内存泄漏,因为分配对象的地址丢失。因此,无法删除已分配的对象
你可以想象上面的声明是这样的
toto *ptr = new toto(0)
toto t = ptr;
所以这个输出的第一行
constructor bool:false
constructor bool:true
对应于参数为0的动态创建的对象
new toto(0)
然后,返回的指针用作初始值设定项,并隐式转换为布尔值true
,用于初始化声明的对象t
。因此,第二行显示了值为true的转换构造函数(带参数的构造函数)的调用
上述声明与本赋值语句之间没有太大区别
t = new toto(false);
因为在赋值的右边使用了指针
因此,隐式定义的复制赋值运算符将不等于nullptr
的指针值转换为布尔值true
这项作业你可以想象以下方式
toto *ptr = new toto(false);
t = toto( ptr );
再次出现内存泄漏
<>从C++ 14标准(4.12布尔转换)< /P>
1算术、非范围枚举、指针或指针的PR值
to成员类型可以转换为bool类型的prvalue零
转换值、空指针值或空成员指针值
虚假;任何其他值都将转换为true。对于
直接初始化(8.5),可以使用std::nullptr_t类型的PR值
转换为bool类型的prvalue;结果值为false
在本声明中:
toto t = new toto(0);
在表达式newtoto(0)
中,您正在使用默认参数0
分配一个toto
。此int
可隐式转换为bool
值false
,并调用bool
构造函数,从而产生以下输出:
constructor bool:false
t.b is true
然后你在做作业:
toto t = /* pointer returned by new */;
此指针可以隐式转换为bool
,由于此指针不是nullptr
,因此它具有非零值。这与接受bool
的toto
构造函数不是explicit
这一事实相结合,意味着bool
的构造函数被调用为t
,导致:
constructor bool:true
这使得t
的b
成员具有值true
,因此下一行代码将产生输出:
constructor bool:false
t.b is true
任何整数值都可以隐式转换为
bool
,0转换为false
,所有其他值转换为true
这同样适用于指针,空指针转换为false
,所有其他指针转换为true
toto t=新toto(0)代码>相当于:
// Create new toto instance, convert 0 to false and assign to p
toto* p = new toto(0);
// Create toto instance on the stack and convert non-null pointer p to true
toto t = toto(p);
通过将单参数构造函数标记为显式
,可以防止这些意外转换,这意味着在隐式转换期间不允许考虑它们:
class toto
{
public:
bool b;
explicit toto(bool x)
{
cout<< "constructor bool:" << (x ? "true": "false")<<endl;
b = x;
}
~toto() {}
};
class toto
{
公众:
布尔b;
显式toto(boolx)
{
coutComments不是用于扩展讨论的;此对话是。这是否回答了您的问题?顺便说一句,这就是为什么使用单个参数的构造函数应始终标记为显式
。问题的标题意味着问题是关于新toto(0),不是关于初始化<代码> t>代码> AHH+,C++,它的许多、许多、许多可爱的手枪都在周围。我几乎总是在C++类中标记单参数构造函数为“代码>显式< /代码>。(例如:qtcreator
创建从QWidget
继承的新类)。有趣的是toto t=false;
被视为隐式转换,尽管它在功能上等同于toto t(false)
。特别是,不执行赋值运算符,构造函数只执行一次。我一直认为,使用哪种初始化形式只是一个尝试问题。@Peter,toto t=toto(false);
相当于toto t(false);
,toto t=false;
通过隐式转换。我知道类型可以转换为false。但问题是为什么以及谁命令了这样的转换?我有一个指针,所以如果返回了兼容类型的指针,为什么它应该转换为bool,而不是直接用于引用toto实例……很难读懂我的c#习惯…@Serge能够编写if(object)
比if(object!=nullptr)