使用默认构造函数显式转换

时间:2017-10-03 14:47:46

标签: c++ default-constructor

我正在通过Scott Myers Effective C ++工作。以下内容出现在文本中。

enter image description here

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

正在发生什么

B创建的B(28)类对象的确切位置,doSomething()需要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的对象是什么?

1 个答案:

答案 0 :(得分:1)

B是一个具有带有int参数的有效构造函数的类。也就是说B在传递int时知道如何构造自己。

28是int的有效表示。

B(28)是一种实例化' B' class,使用带有int的构造函数。

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

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

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

现在,功能DoSomething希望通过' B'宾语。由于B(28)是' B'的有效结构。对象,它满足DoSomething的参数列表。

致电时:

DoSomething(B(28));

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

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

DoSomething(B bObject)...

此功能签名需要某种类型的' B'要传递,它将在函数内被称为bObject。

因此,

bObject.b = 1;

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

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

因此,做一些无用的事情(将一个临时对象传递给一个函数,然后修改它,然后让它不再存在。)据我所知。

作者真正试图解释的是“明确”的重要性。在构造函数中。该示例有助于明确构造函数,不包括对参数的隐式转换或其他内容。

相关问题