C++ 使用转换运算符实现两个不同类的对象的相互转换

C++ 使用转换运算符实现两个不同类的对象的相互转换,c++,operator-overloading,conversion-operator,C++,Operator Overloading,Conversion Operator,在下面的代码中,类B中定义的转换运算符是如何工作的?我阅读了所有其他与堆栈溢出上的转换运算符相关的文章,但找不到关于两个不同类的对象相互转换的任何解释。任何帮助都将不胜感激,因为我是c的新手++ 对于以下代码: #include<iostream> using namespace std; class A { int i; public: A(int ii = 0) : i(ii) {} void show() { cout << i <&

在下面的代码中,类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的对象的。基本上,我无法理解代码流,我想知道幕后的情况,即转换是如何进行的?

编译器必须以某种方式解决如何处理gb。唯一可用的候选者是void gA,因此它检查是否可以使用它。如果存在一种合法地将参数b转换为a的方法,那么这是一种可能性。因为B有一个相应的转换运算符,所以情况确实如此。事实上,这是唯一的可能。因此,实际上,调用gb相当于

g(static_cast<A>(b));

它显式地调用转换运算符。

下面是发生的情况:

您可以创建b类型:b 你调用g作为它的参数 b是类型b,g需要类型a的变量,g寻找从b转换为a的方法 A和B都是类,B重载转换运算符A g的输入自动转换为b.Operator,返回A g在a为b的情况下执行 g调用 g的结尾
在C++中,有一种称为过载解决过程的东西。这会在其他函数中一直起作用,以选择要调用的最佳可行函数

对于以下情况:

void g(A a)
{
    a.show();
}

int main()
{
    B b(10);
    g(b);
    ...
}
void g(A a)
{
    a.show();
}

int main()
{
    B b(10);
    g(23);
    ...
}
这里有一个用户定义的转换序列。因为没有任何函数重载的g,在任何CV类型的b,转换序列将排名上升。事实证明,A可以由B构造而成,这是因为B中有

因此,将调用B中的转换函数运算符来生成A,该函数用于初始化g中的参数

对于以下情况:

void g(A a)
{
    a.show();
}

int main()
{
    B b(10);
    g(b);
    ...
}
void g(A a)
{
    a.show();
}

int main()
{
    B b(10);
    g(23);
    ...
}

您有一个可以从int构建a类型对象的a

您不清楚的是什么?@walter:我无法理解转换运算符是如何工作的,以及该值是如何分配给对象的。基本上我无法理解代码的流程。