重载的转换操作符或单个参数的构造函数

时间:2010-08-11 17:50:59

标签: c++ constructor casting

如果一个类有一个参数构造函数,我理解它是由构造函数隐式转换为适当上下文中的参数类型。定义转换运算符还会使类可转换为其他类型。问题

  • 是否会隐式调用转换运算符?
  • 如果为一个类定义了单个参数构造函数和具有相同类型的转换运算符,那么它是否优先于另一个或者它是否含糊不清?
  • 如果您决定要将某个类转换为给定类型,哪种方法更好,还是应该同时提供?

编辑:

我看到我不明白方向性,两人在相反的方向上进行转换。作为后续

  • 如果你可以控制两个你想互相转换的类,那么这两个操作是否有一个首选的方法来实现这个目的?
  • 是否可以将转换运算符标记为显式?

3 个答案:

答案 0 :(得分:7)

这两个是对立的:非显式单参数构造函数允许从参数类型自动类型转换 您的类类型。转换运算符允许隐式转换来自您的类类型。

如果没有特别要求,常识是避免两者。

答案 1 :(得分:3)

不,如果一个类有一个参数构造函数可以隐式转换来自其参数的类型。

至于你的其他问题:

  • 是否会隐式调用强制转换操作符?

是的,只要有需要。

  • 如果为一个类定义了单个参数构造函数和具有相同类型的强制转换运算符,那么它是否优先于另一个或者它是否含糊不清?

我不太清楚你在问什么,但如果转换可以采取任何一种方式,那就不明确了。

  • 如果您决定要将某个类转换为给定类型,哪种方法更好,还是应该同时提供?

你必须使用强制转换 - 构造函数不要这样做。

通常,如果您不希望从类自动转换为其他类型(并且大多数情况下不需要),则最好提供永远不会自动调用的命名转换函数(ToString,ToInt,ToX)。由编译器。

引出了另外两个问题:

  • 如果你可以控制两个你想互相转换的类,那么这两个操作是否有一个首选的方法来实现这个目的?

是,使用命名函数执行至少一次转换。 std :: string这样做 - 使用构造函数从char *转换为string,但另一种方法是使用命名的c_str()函数。

  • 是否可以将转换运算符标记为显式?

不幸的是,没有。

答案 2 :(得分:2)

  

如果你可以控制两个你想要互相转换的类,那么这两个操作是否有一个首选的方法来实现这个目的?

我会写一个单一参数, 显式 构造函数。

在允许隐式转换时,我看到了太多非常糟糕的惊喜,所以我总是不允许它们。编写f(A(b))并不比编写f(b)困难得多,并且当右f()不在范围内时,编译器有更多机会提供有意义的错误消息。