这种隐式转换是如何发生的?

时间:2011-05-06 15:12:31

标签: c++

这种隐式转换是如何发生的?

class A {};
class B { public: B (A a) {} };

A a;
B b=a;

类B有一个构造函数B(A a)将对象a作为对象,但在B的构造函数中,它什么都不做。那怎么会这样呢?

5 个答案:

答案 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();现在它f100没有任何作用,这是一个不同的故事。它与函数调用没有任何关系。

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