使用转换运算符互换两个不同类的对象

时间:2017-06-28 20:27:16

标签: 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 << 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的对象。基本上我无法理解代码的流程,我想在幕后知道转换是如何进行的?

3 个答案:

答案 0 :(得分:2)

这是发生了什么:

  1. 您创建了b(类型:B
  2. 您致电g传递b作为参数
  3. b的类型为Bg需要A类型的变量,g寻找从B转换的方式到A
  4. AB都是类,B重载“转换运算符”operator A()
  5. g的输入会自动转换为b.operatorA(),并返回A
  6. gab.operatorA()
  7. 的情况下执行
  8. g调用show
  9. 上的方法a
  10. g
  11. 的结尾

答案 1 :(得分:1)

在C ++中,在重载解析期间会出现Implicit Conversion Sequences这样的事情。这会在其他时间开始选择最佳的可行功能。

对于以下情况:

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

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

您有一个用户定义的转换序列。由于g的函数重载没有任何CV类型的b,因此转换序列将用于排名。事实证明A可以BB中的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));

显式调用转换运算符。