【问题标题】:overloaded cast operator or single argument constructor重载强制转换运算符或单参数构造函数
【发布时间】:2010-08-12 05:44:15
【问题描述】:

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

  • 是否会隐式调用转换运算符?
  • 如果为一个类同时定义了具有相同类型的单参数构造函数和转换运算符,那么其中一个是否具有优先于另一个的优先级,还是不明确?
  • 如果您决定希望类可转换为给定类型,哪种方法更好,还是应该同时提供?

编辑:

我发现我没有清楚地理解方向性,并且两者在相反的方向上执行转换。作为后续

  • 如果您可以控制两个要相互转换的类,是否有针对这两个操作的首选方法来完成此操作?
  • 是否可以将转换运算符标记为显式?

【问题讨论】:

    标签: c++ constructor casting


    【解决方案1】:

    这两者是相反的:非显式单参数构造函数允许自动类型转换 你的类类型从参数类型。转换运算符允许从您的类类型中隐式转换

    如果不是特别需要,一般的智慧是避免两者。

    【讨论】:

    • 您是否建议 std::string 不应该从 const char * 进行隐式转换?这将使该类更难使用。
    • 不,我不是这么说的。但我见过很多人在自己的字符串类上定义转换运算符,然后惊讶于+ 并不总是串联,而是指针运算。
    • 当然,如果他们不知道自己在做什么,他们就不应该编写自己的字符串类,而不是应该禁止所有转换?
    • Neil,“如果没有特别要求” 限定词对您来说还不够吗?
    【解决方案2】:

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

    至于你的其他问题:

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

    是的,只要需要。

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

    我不太清楚你在问什么,但如果转换可以通过任何一种方式进行,那就是模棱两可。

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

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

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

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

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

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

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

    很遗憾,没有。

    【讨论】:

      【解决方案3】:

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

      我会写一个单参数的 explicit 构造函数。

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

      【讨论】:

        猜你喜欢
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 2021-01-28
        • 1970-01-01
        相关资源
        最近更新 更多