【问题标题】:User Defined Conversions in C++C++ 中的用户定义转换
【发布时间】:2010-06-09 18:25:25
【问题描述】:

最近,我浏览了来自 O'Reilly Media 的 C++ Pocket Reference 副本,当我看到一个关于用户定义转换的简短部分和示例时,我感到很惊讶 -定义类型:

#include <iostream>

class account {

    private:
        double balance;

    public:
        account (double b) { balance = b; }

        operator double (void) { return balance; }
};

int main (void) {

    account acc(100.0);
    double balance = acc;

    std::cout << balance << std::endl;

    return 0;
}

我用 C++ 编程已经有一段时间了,这是我第一次看到这种运算符重载。这本书对这个主题的描述有点简短,给我留下了一些关于这个特性的未回答的问题:

  • 这是一个特别晦涩的功能吗?正如我所说,我已经用 C++ 编程了一段时间,这是我第一次遇到这种情况。我没有太多运气找到有关此的更深入的材料。
  • 这是相对便携的吗? (我在 GCC 4.1 上编译)
  • 可以将用户定义的类型转换为用户定义的类型吗?例如

    运算符 std::string () { /* 代码 */ }

【问题讨论】:

  • 这和这个问题有什么关系?

标签: c++ operator-keyword


【解决方案1】:

这是一个特别晦涩的功能吗?

是的,转换运算符不经常使用。我见过它们的地方是用户定义的类型,这些类型可以降级为内置类型。诸如支持与原子序数类型相互转换的固定精度数字类。

这个比较便携吗?

据我所知,确实如此。他们一直在标准中。

是否可以将用户定义的类型转换为用户定义的类型?

是的,这是构造函数的特性之一。采用单个参数的构造函数有效地创建了从参数类型到类类型的转换运算符。比如这样一个类:

class Foo {
public:
    Foo(int n) {
        // do stuff...
    }
}

让你做:

Foo f = 123;

如果您以前使用过std::string,那么您很可能在没有意识到的情况下使用过此功能。 (顺便说一句,如果您想防止这种行为,请使用explicit 声明任何单参数构造函数。)

【讨论】:

  • 哈哈,我在这里研究这个是为了让我的 LoxType 以某种方式转换为 LoxCallable。有点让我措手不及,最有用的答案恰好是我必须实现的 Lox 语言的作者
【解决方案2】:

这不是特别晦涩;它非常便携(毕竟它是语言的一部分),并且可以转换为用户定义的类型。

请注意,有很多可能的隐式转换路径可能会导致调用意外转换和令人惊讶的错误。此外,在几个用户定义的类型之间使用非显式转换构造函数和转换函数可能会导致更模棱两可的转换序列,这可能很难解决。

【讨论】:

    【解决方案3】:

    这是我在学习 C++ 时偶然发现的第一件事,所以我想说不,这并不是那么晦涩难懂。

    我要提醒的一件事是:除非您确切知道自己在做什么,否则请使用 explicit 关键字。隐式转换会导致代码以意想不到的方式运行,因此在大多数情况下应避免使用它们。坦率地说,如果语言没有它们,我会更开心。

    【讨论】:

    • 请注意,暂时只能将转换构造函数标记为显式。转换运算符始终是隐式的,尽管在 C++0x 中有所改变。
    • 我今天才知道这件事。我想这使我成为今天的幸运 10,000 人之一。漂亮的功能;我已经用上了。
    • @EdwardFalk - 哦,它有很多的用途。当它开始导致调用您不打算使用的例程重载时,问题就出现了。 明智地使用此功能
    【解决方案4】:

    这是一个特别有用的标准 C++ 功能,而且不是有点晦涩难懂 :) 您可以对转换运算符使用基本类型和用户定义类型。

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多