这种隐式转换是如何发生的
how does this Implicit conversion happen?
这种隐式转换是如何发生的?
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()
;现在它f
对100
没有任何作用,这是一个不同的故事。它与函数调用没有任何关系。
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++中阅读有关显式关键字的信息
注意:上面的示例仅供参考,因此请忽略等效符号以进行语法验证
转换意味着"构造 B 的实例,将 A 的实例作为构造函数参数传递"。
B 是否实际使用该 A 实例在构造函数中执行任何操作都无关紧要。无论 A 实例的值是否对结果有任何影响,它仍然是转换。
B
的构造函数不需要做任何事情。
通过创建将A
作为参数的 [非显式] 构造函数,您可以A
转换为 B
。
函数主体是您可以指定应在此类构造上执行的行为的地方,但由于您没有在那里编写任何内容(ctor-initializer
中也没有任何东西),因此不会发生任何事情。
由于语言的原因,B
的实际构造仍然像往常一样发生。
你只是得到B
,就好像你通过你能想出的任何其他构造函数创建了它,要么没有参数,要么是你永远无法使用的参数。
顺便说一句,您可能应该接受A& const
,而不是A
.
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 为什么在类型转换的 nullptr 上不发生隐式转换
- 类模板中未发生隐式转换
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 使用 opencv 凸胡尔 获取给定点的面积. - 点到垫子转换期间发生错误
- std::filesystem::p ath 和 std::string 之间的隐式转换,应该发生吗?
- 为什么用户定义的转换不会在调用对象上隐式发生
- 为什么在波纹管程序中发生了从字符串常量到'char*'的警告已弃用的转换
- 两种类型转换有何不同?
- 隐式类型转换何时在C++发生?
- 当函数调用时,试图阻止数组更改时发生无效转换错误
- 使用 GCC 7.3.0 时发生代码转换错误
- 当我们递增下面的类型转换指针时会发生什么?
- 在C++中对指针进行类型转换"sideways"时会发生什么情况
- 隐式强制转换在 C++ 表达式中发生的时间点
- 为什么显式 bool() 转换在上下文转换中不发生
- 使用基类中定义的函数返回指向派生类实例的指针时发生无效转换错误
- C 构造函数隐式转换不会发生
- 如果我除以 1,隐式类型转换不会发生