使用默认构造函数的显式转换
Explicit casting using default constructor
我正在研究 Scott Myers Effective C++。文中出现以下内容。
我很难理解有效语法语句的含义 doSomething(B(28));
class 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
?
B 是一个 class,它有一个带 int 参数的有效构造函数。也就是说B在传入一个int的时候就知道如何构造自己了。
28 是 int 的有效表示。
B(28) 是一种实例化 'B' class 的方法,使用采用 int 的构造函数。
进一步说明,'B' 的构造函数将采用一个 int 和一个 bool,但两个参数都是 "optional",这由 int 参数的“= 0”表示,以及 bool 参数的“= true”。
由于参数是可选的,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 class 的 'b' 成员。
也许这有点令人困惑的原因是在 DoSomething 完成设置 B class 的 b 成员并且函数退出后,B class 不再存在,所以有退出 DoSomething 函数后无法证明 b 成员已被修改。
据我所知,这是一件有点无用的事情(将一个临时对象传递给一个函数,然后修改它,然后让它消失。)。
作者真正想说明的似乎是'explicit'在构造函数中的意义。该示例有助于说明他对显式构造函数的观点,不包括对参数的隐式转换或其他内容。
我正在研究 Scott Myers Effective C++。文中出现以下内容。
我很难理解有效语法语句的含义 doSomething(B(28));
class 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
?
B 是一个 class,它有一个带 int 参数的有效构造函数。也就是说B在传入一个int的时候就知道如何构造自己了。
28 是 int 的有效表示。
B(28) 是一种实例化 'B' class 的方法,使用采用 int 的构造函数。
进一步说明,'B' 的构造函数将采用一个 int 和一个 bool,但两个参数都是 "optional",这由 int 参数的“= 0”表示,以及 bool 参数的“= true”。
由于参数是可选的,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 class 的 'b' 成员。
也许这有点令人困惑的原因是在 DoSomething 完成设置 B class 的 b 成员并且函数退出后,B class 不再存在,所以有退出 DoSomething 函数后无法证明 b 成员已被修改。
据我所知,这是一件有点无用的事情(将一个临时对象传递给一个函数,然后修改它,然后让它消失。)。
作者真正想说明的似乎是'explicit'在构造函数中的意义。该示例有助于说明他对显式构造函数的观点,不包括对参数的隐式转换或其他内容。