这种隐式转换是如何发生的?
class A {};
class B { public: B (A a) {} };
A a;
B b=a;
类B有一个构造函数B(A a)将对象a作为对象,但在B的构造函数中,它什么都不做。那怎么会这样呢?
答案 0 :(得分:3)
当您编写B
时,将调用带有A
类型参数的B b=a
构造函数。确实B
的构造函数对参数a
没有任何作用,但这完全是另一回事。
相当于:
B b(a); //equivalent to "B b = a;"
语法B b=a
调用B
的构造函数,该构造函数将A
作为参数;之后构造函数对参数a
所做的事情与构造函数的调用无关!
就像下面的情况一样,当你写f(100)
时,你将100传递给f()
;现在它f
对100
没有任何作用,这是一个不同的故事。它与函数调用没有任何关系。
void f(int a)
{
return;
}
f(100);
答案 1 :(得分:0)
那怎么会发生这种情况?
B(A a)被调用。几乎与该构造函数中发生的事情相同,就好像b是默认使用空的默认构造函数构造的。执行B成员的默认构造函数。
答案 2 :(得分:0)
这是因为在C ++中,在调用构造函数时,允许对一个参数进行隐式转换。
例如。如果您有以下课程:
class A
{
int a;
public:
A(int _a):a(_a){}
} ;
然后,以下声明有效:
A ob = 5 ;
equivalent to `A ob(int(5)) ;`
通过此示例的类比,在您的情况下,B b = a;
可以展开为B b(A(a));
此外,您可以在C ++中阅读显式关键字
注意:上面的示例仅供参考,请忽略语法验证的等效表示法
答案 3 :(得分:0)
从A转换为B意味着“构造B的实例,将A的实例作为构造函数参数传递”。
B是否使用 A的实例在构造函数中做任何事情是无关紧要的。无论A实例的值是否对结果产生任何影响,它仍然是转换。
答案 4 :(得分:0)
B
的构造函数不需要 来做任何事情。
通过创建以A
作为参数的[非显式]构造函数,您可以将A
转换为B
。
您可以在构造函数体中指定应该在此类构造上执行的行为,但由于您没有在那里写任何内容(并且ctor-initializer
中也没有任何内容),因此没有任何反应。
由于语言原因,B
的实际构造仍然如常。
您只需获得B
,就像您通过您可以提出的任何其他构造函数创建的那样,无论是参数还是参数,您都无法使用
BTW,您应该接受A& const
,而不是A
。