1

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 的对象。基本上我无法理解代码流,我想知道幕后,即转换是如何发生的?

4

3 回答 3

2

这是发生了什么:

  1. 您创建b(类型B:)
  2. 你调用g传递b作为它的参数
  3. b是 类型B,g需要一个 类型 变量A,g寻找一种方法来转换 fromBA
  4. A和都是B类,B重载“转换运算符”operator A()
  5. 的输入g会自动转换为b.operatorA()返回一个A
  6. ga被执行b.operatorA()
  7. g调用show方法a
  8. 结尾g
于 2017-06-28T20:53:46.103 回答
1

在 C++ 中,在重载决议期间有一种称为隐式转换序列的东西。这会一直在其他选择要调用的最佳可行函数。

对于以下情况:

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

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

您在那里有一个用户定义的转换序列。由于没有g任何 CV 类型的函数重载,因此b转换序列将获得排名。事实证明,A可以从B中的转换运算符构造B。这是使用的。

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


对于以下情况:

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

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

您有一个转换构造函数,它能够Aint

于 2017-06-28T20:58:13.660 回答
0

编译器必须以某种方式确定如何处理您的g(b). 唯一可用的候选者是void g(A),所以它检查它是否可以使用它。如果存在一种将参数 ( b) 合法转换为 an 的方法,A那么这是有可能的。由于B有对应的转换运算符,确实如此。事实上,这是唯一的可能。所以,事实上的调用g(b)变得等同于

g(static_cast<A>(b));

显式调用转换运算符。

于 2017-06-28T20:50:45.803 回答