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

how does this Implicit conversion happen?

本文关键字:何发生 转换      更新时间:2023-10-16

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

class A {};
class B { public: B (A a) {} };
A a;
B b=a;
类 B 有一个构造函数 B

(A a) 将对象 a 作为对象,但在 B 的构造函数内部,它什么也不做。 那么这是怎么发生的呢?

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);

那么这是怎么发生的呢?

B(A a) 被调用。在该构造函数中发生的几乎相同的事情,就好像 b 是使用空的默认构造函数默认构造的一样。执行 B 成员上的默认构造函数。

发生这种情况是因为在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++中阅读有关显式关键字的信息

注意:上面的示例仅供参考,因此请忽略等效符号以进行语法验证

从 A 到 B 的

转换意味着"构造 B 的实例,将 A 的实例作为构造函数参数传递"。

B 是否实际使用该 A 实例在构造函数中执行任何操作都无关紧要。无论 A 实例的值是否对结果有任何影响,它仍然是转换。

B的构造函数不需要做任何事情。

通过创建将A作为参数的 [非显式] 构造函数,您可以A转换为 B

构造

函数主体是您可以指定应在此类构造上执行的行为的地方,但由于您没有在那里编写任何内容(ctor-initializer中也没有任何东西),因此不会发生任何事情。

由于语言的原因,B的实际构造仍然像往常一样发生。

你只是得到B,就好像你通过你能想出的任何其他构造函数创建了它,要么没有参数,要么是你永远无法使用的参数。

顺便说一句,您可能应该接受A& const,而不是A.