gpt4 book ai didi

c++ - 使用默认构造函数的显式转换

转载 作者:行者123 更新时间:2023-11-28 04:58:53 27 4
gpt4 key购买 nike

我正在研究 Scott Myers Effective C++。以下内容出现在正文中。

enter image description here

我很难理解有效语法语句 doSomething(B(28));

B 类的对象究竟是如何从 B(28) 创建的,因为 doSomething() 需要一个 类型的参数code>B bObject.

进一步,假设class B的完整定义如下:

class B{
int b;
public:
explicit B(int x = 0, bool b = true);
}

此外,假设 doSomething() 是这样定义的:

void doSomething(B bObject){
bObject.b = 1;
}

doSomething(B(28));b成员是如何访问的?即访问的是什么对象的成员变量b

最佳答案

B 是一个具有有效构造函数的类,该构造函数采用 int 参数。也就是说,当 B 传递一个 int 时,它知道如何构造自己。

28 是 int 的有效表示。

B(28) 是一种实例化“B”类的方法,使用采用 int 的构造函数。

为了进一步澄清,'B' 的构造函数将采用一个 int 和一个 bool,但这两个参数都是“可选的”,这由 int 参数的“= 0”和“= true”表示"对于 bool 参数。

由于参数是可选的,B 可以在不指定参数的情况下构造,在这种情况下,它将以 x=0 和 b=true 构造。它还可以使用指定的 int 参数构造,如您的示例所示。在您的示例中,x=28,b=true。它也可以在指定两个参数的情况下构造。例如B(8,假)。但是,不可能只指定 bool 参数。例如,B(false) 将不起作用。填写可选参数时无法跳过参数。 B(,false) 无效...

因此,B(28) 构造了一个 x=28 的 B 对象。

现在,函数 DoSomething 期望传递一个“B”对象。由于 B(28) 是“B”对象的有效构造,因此它满足 DoSomething 的参数列表。

当你打电话时:

DoSomething(B(28));

构造“B”对象,并将其作为参数传递给 DoSomething。

在函数内部,B 被称为“bObject”,因为函数签名:

DoSomething(B bObject)...

这个函数签名想要传递类型为“B”的东西,它在函数内部被称为 bObject。

因此,

bObject.b = 1;

将值 1 分配给构造并传递给函数的 B 类的“b”成员。

也许这有点令人费解的原因是,在DoSomething完成设置B类的b成员后,函数退出,B类不再存在,所以退出DoSomething函数后无法证明b 成员被修改了。

因此据我所知,这是一件有点无用的事情(将一个临时对象传递给一个函数,然后修改它,然后让它消失。)。

作者真正想要解释的似乎是构造函数中“explicit”的意义。该示例有助于阐明他关于显式构造函数的观点,不包括对参数的隐式转换或其他内容。

关于c++ - 使用默认构造函数的显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46547395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com