C ++运算符重载合成转换

时间:2011-01-03 13:00:28

标签: c++ operator-overloading

这个例子来自“Thinking in C ++”,我有一个关于编译器合成运算符转换函数的问题。

问题
当传递类4的对象时(在函数调用f()中),调用重载操作()。但是我无法通过编译器弄清楚所使用的逻辑(编译器合成操作调用)来实现这种转换。

在max,我可以期待明确的转换行为,比如
1. obj3 =(三)obj4;
2. obj3 =三(obj4);
3. obj3 = static_cast <Three&gt; (OBJ4);

现在进行上述任何一种转换 - 编译器如何合成,
(三)obj4.operator()?

可能是我遗漏了一些重点。

示例

//: C12:Opconv.cpp
// Op overloading conversion

class Three {
  int i;
public:
  Three(int ii = 0, int = 0) : i(ii) {}
};

class Four {
  int x;
public:
  Four(int xx) : x(xx) {}
  operator Three() const { return Three(x); }
};

void g(Three) {}

int main() {
  Four four(1);
  g(four);
  g(1);  // Calls Three(1,0)
} ///:~

2 个答案:

答案 0 :(得分:1)

首先,它不是您提供的operator(),而是operator Three。此运算符告诉编译器如何将class Four的对象转换为class Three的对象。在g(four)中,调用编译器正在使用此运算符,因为函数g期望类型为Three的参数。由于存在转换,因此编译器正在使用它。在第二种情况下,由于Three的构造函数未声明为explicit,因此可以使用单个整数构造class Three的对象(使用Three构造函数)编译器正在使用该构造函数创建class Three的对象,以便可以调用函数g

答案 1 :(得分:0)

首先,class Four不包含operator(),但它有一个operator Three(),它是一个转换运算符。

在第

g(four);

编译器需要将four转换为class Three的对象,并合成对operator Three()的调用以执行该转换。 合成转换相当于

g(four.operator Three());