B类中定义的转换运算符如何在以下代码中工作?我在堆栈溢出时阅读了与转换运算符相关的所有其他文章,但是找不到两个不同类的对象的互换的任何解释。任何帮助都会非常感激,因为我是c ++的新手
以下代码:
#include<iostream>
using namespace std;
class A
{
int i;
public:
A(int ii = 0) : i(ii) {}
void show() { cout << i << endl; }
};
class B
{
int x;
public:
B(int xx) : x(xx) {}
operator A() const { return A(x); }
};
void g(A a)
{
a.show();
}
int main()
{
B b(10);
g(b);
g(20);
return 0;
}
我无法理解转换运算符的工作原理以及如何将值分配给A的对象。基本上我无法理解代码的流程,我想在幕后知道转换是如何进行的?
答案 0 :(得分:2)
这是发生了什么:
b
(类型:B
)g
传递b
作为参数b
的类型为B
,g
需要A
类型的变量,g
寻找从B
转换的方式到A
A
和B
都是类,B
重载“转换运算符”operator A()
g
的输入会自动转换为b.operatorA()
,并返回A
g
在a
为b.operatorA()
g
调用show
a
g
答案 1 :(得分:1)
在C ++中,在重载解析期间会出现Implicit Conversion Sequences这样的事情。这会在其他时间开始选择最佳的可行功能。
对于以下情况:
void g(A a)
{
a.show();
}
int main()
{
B b(10);
g(b);
...
}
您有一个用户定义的转换序列。由于g
的函数重载没有任何CV类型的b
,因此转换序列将用于排名。事实证明A
可以B
由B
中的conversion operator构建。这是用的。
因此,B
中的转换函数(运算符)将被调用以生成A
,用于初始化g
中的参数
对于以下情况:
void g(A a)
{
a.show();
}
int main()
{
B b(10);
g(23);
...
}
您有converting constructor能够从A
int
类型的对象
答案 2 :(得分:0)
编译器必须以某种方式确定如何处理g(b)
。唯一可用的候选者是void g(A)
,因此它会检查它是否可以使用它。如果存在合法地将参数(b
)转换为A
的方法,那么这是可能的。由于B
具有相应的转换运算符,因此确实如此。事实上,这是唯一的可能性。所以,事实上,电话g(b)
等同于
g(static_cast<A>(b));
显式调用转换运算符。