用户定义的C ++转换

时间:2010-06-09 18:25:26

标签: c++ operator-keyword

最近,我正在浏览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)
  • 用户定义的转换是否可以完成? e.g。

    operator std :: string(){/ * code * /}

4 个答案:

答案 0 :(得分:12)

  

这是一个特别模糊的功能吗?

是的,不经常使用转换运算符。我见过它们的地方是用户定义的类型,可以降级为内置类型。像固定精度数字类,支持转换为原子数类型/从原子数类型转换。

  

这是否相对便携?

据我所知,确实如此。他们永远都是标准。

  

用户定义的转换是否可以完成用户定义的类型?

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

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

让你做:

Foo f = 123;

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

答案 1 :(得分:4)

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

提醒一句,拥有大量可能的隐式转换路径可能会导致调用意外转换和令人惊讶的错误。此外,在几个用户定义的类型之间使用非显式转换构造函数和转换函数可能会导致更加暧昧的转换后续处理,这可能是一个难以解决的问题。

答案 2 :(得分:4)

当我学习C ++时,这是我遇到的第一件事,所以我会说不,这并不是那么模糊。

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

答案 3 :(得分:3)

这是一个特别有用的标准C ++功能,并没有一点模糊:) 您可以为转换运算符使用基本和用户定义的类型。