用户定义的C++转换

was*_*ash 9 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个特别模糊的功能吗?正如我所说,我已经用C++编程了一段时间,这是我第一次遇到这个问题.我没有太多运气找到更深入的材料.
  • 这相对便携吗?(我正在编写GCC 4.1)
  • 是否可以完成用户定义的用户定义转换?例如

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

mun*_*ent 12

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

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

这相对便携吗?

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

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

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

class Foo {
public:
    Foo(int n) {
        // do stuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

我们你做的:

Foo f = 123;
Run Code Online (Sandbox Code Playgroud)

如果您以前使用std::string过,可能是因为您没有意识到这个功能.(顺便说一句,如果要防止此行为,请使用声明任何单参数构造函数explicit.)


CB *_*ley 5

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

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