Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将int作为bool参数传递到C++;_C++_Pointers_Constructor_Boolean_Implicit Conversion - Fatal编程技术网

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)