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

标签 c++ operator-overloading

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

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

最多,我可以期待显式转换行为,比如
1. obj3 = (三)obj4;
2. obj3 = 三(obj4);
3. obj3 = static_cast <Three > (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)
} ///:~

最佳答案

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

关于C++ 运算符重载合成转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4584614/

相关文章:

c++ - 重载运算符 == & !=

c++ - 分配给在 C++ 中创建的对象

C++重载运算符和const

c++ - 尝试包装和覆盖全局运算符 new 时的递归调用

c++ - 将 C 头文件中的 __declspec 转换为 Delphi

c# - 从 C# 调用 Advapi32.dll native EventWrite 函数?

c++ - wglCreateContextAttribsARB 在有能力的硬件上返回 NULL

c++ - 将包含字符串数组和整数数组的结构传递给 C++ DLL

c++ - 重载运算符问题 C++

c++ - 字符、指针、强制转换和字符串问题