我想知道转换方法之间是否存在差异,以及一种是否比另一种更好。
假设有一个class A
和一个class B
。 class B
可以转换为 class A
。例如,class A
代表字符串,class B
代表整数。
您可以通过多种方式从 class B
对象获取 class A
对象:
operator A()
class B
中的函数以允许隐式转换
函数以允许显式转换class B
中的显式运算符 A()A toA()
class B
中的函数,有效地转换它static A parse(B)
class A
中的函数来转换它A(B)
class A
中的构造函数来创建一个新对象
是否有任何首选的转换对象的方法?应该采用多种方式吗?应该避免吗?还是完全基于上下文,是否应该根据最佳判断来确定?
最佳答案
自从我发布这个问题以来已经有一段时间了,从那时起我制定了一些我试图在我的项目中坚持的指导方针,我想我会分享它们以便其他偶然发现这个问题的人可以从中受益他们也是。
我也欢迎对这些指南的缺点提出任何意见,因为它们可能并不完美。
一个对象应该只为以某种方式与该类直接相关的对象提供隐式转换构造函数。例如,提供接受 char 数组的构造函数的字符串类。当转换有损或类不相关时,使用显式转换构造函数。
一个对象应该只为与其直接相关的对象提供隐式转换运算符,并且进行无损转换(没有信息丢失)。同样,字符串可以提供到字符数组的转换。如果不是这种情况,则应使用显式转换运算符。
为所有转换运算符(隐式和显式)提供 toX() 函数。这并不是一个严格的指导方针,而是更多的个人偏好。在我看来,有时最好在您的代码中编写 toX(),因为它能更好地传达您的意图。
仅当出于某种原因必须是静态函数时才使用 parse(X) 函数。
自由函数可以用作 parse(X) 函数的替代,这取决于个人喜好。
正如我所说,我欢迎任何意见,我希望这可以帮助别人。
关于c++ - 转换函数/运算符,静态解析函数还是转换构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948331/