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

bpw*_*621 8 c++ constructor casting

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

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

编辑:

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

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

Nik*_*sov 7

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

如果没有特别要求,通常的智慧是避免两者.

  • 你是否建议std :: string不应该有来自const char*的隐式转换?这将使该课程更难使用. (2认同)

小智 3

不,如果类具有单个参数,则构造函数可以从其参数的类型隐式转换。

至于你的其他问题:

  • 强制转换运算符是否会被隐式调用?

是的,只要需要就可以。

  • 如果为一个类定义了具有相同类型的单参数构造函数和强制转换运算符,其中之一是否优先于另一个,或者是否有歧义?

我不太清楚你在问什么,但如果转换可以以任何一种方式进行,那就含糊不清。

  • 如果您决定希望一个类可转换为给定类型,那么哪种方法更好,还是应该同时提供两种方法?

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

一般来说,如果您不希望从类自动转换为其他类型(大多数情况下您不需要),最好提供命名转换函数(ToString、ToInt、ToX),这些函数永远不会被编译器自动调用。

这引出了你的另外两个问题:

  • 如果您可以控制两个想要相互转换的类,那么这两个操作是否有首选方法来完成此操作?

是的,使用命名函数来执行至少一项转换。std::string 就是这样做的 - 使用构造函数将 char * 转换为字符串,但另一种方式您需要使用命名的 c_str() 函数。

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

很不幸的是,不行。