c++ - 我是否需要重载类的强制转换运算符?

标签 c++ casting type-conversion operator-overloading copy-constructor

我目前正在计划一个带有一些转换函数的类(class)。我只是想知道什么时候我必须重载一个类的转换运算符。当我有一个转换构造函数 A(B& b) 时,据我所知,每当我需要将 B 转换为 A 时,我可以只使用转换构造函数。

例子:

B b, c, d;
A a = b; // conversion constructor automatically called
a = A(c); // could also overload assignment operator
function_of_a((A)d); // can equally write this as function_of_a(A(d))

目前我计划只使用一个转换构造函数,而我没有看到重载转换运算符的任何目的,而且我还计划有意不重载 A = B 的赋值运算符以使转换在代码中更加明显。

最佳答案

如果您要转换为原始类型或您无法访问的类型,您显然必须编写一个强制转换运算符 - 例如,operator bool()operator std::string( )

除此之外,这主要是界面设计的问题。转换构造函数是目标类型接口(interface)的一部分。转换运算符是源类型接口(interface)的一部分。您需要决定转换应该属于哪个接口(interface)。

例如,假设您有一个 fancy_string 类,以及其他十几个可以转换为 fancy_string 以生成 fancy_string 表示的类. fancy_string 是否应该包含所有这些类的转换构造函数?可能不会。这将使 fancy_string 依赖于所有这十几个类,并且每次添加一个应该可转换为 fancy_string 的类时,您都必须更改 fancy_string 还有。这是糟糕的设计。在这些类中的每一个中都提供一个转换运算符会好得多,因为转换为 fancy_string 的能力应该是这些类接口(interface)的一部分,而不是 fancy_string.

关于c++ - 我是否需要重载类的强制转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24790363/

相关文章:

c++ - 使用动态参数创建线程

c++ - 类型转换问题 : Returning as integer instead of float/type

java - 为什么从 String[] 到 Object 的转换只能使用引用?

java - 将变量声明为某种类型

c++函数不接受0个参数

c++ - 使用 LuaBridge 将 LuaJIT 绑定(bind)到 C++ 导致 "PANIC: unprotected error"

c++ - 基于 C++ 组件设计的结构与命名空间

android - RSS 应用程序停止

arrays - 将 C 字符串数组转换为 Swift 字符串数组

r - 如何将两列数据帧转换为命名向量?