C++转换运算符过载

C++ conversion operator overload

本文关键字:运算符 转换 C++      更新时间:2023-10-16

‘int’和‘double’转换函数是‘explicit’的,在这段代码中,为什么我允许使用这种转换而不是错误消息?如果我删除我所有的转换过载功能代码发生"转换错误"

class Person
{
public:
    Person(string s = "", int age = 0) :Name(s), Age(age) {}
    operator string() const { return Name; }
    explicit operator int() const{ return 10; }  // ! Explicit
    explicit operator double()const { return 20; } //! Explicit
    operator bool()const { if (Name != "") return true; return false; } // using this
};
int main(){
    Person a;
    int z = a;
    std::cout << z << std::endl;   // Why print "1"?  Why uses bool conversion?
}

我认为这是答案:

因为"a"不能转换为int或double,所以会出现错误,但因为它有bool转换函数,可以转换为int和int到double,代码使用此函数。

int z = a;

看起来无害,对吧?

上一行调用了隐式bool转换运算符,因为这是从Personint的唯一方法,并且只需要一个用户定义的转换(允许的最大值)。

这就是C++11之前使用安全布尔习惯用法的原因,也是将转换运算符和单参数因子标记为explicit的一般建议的主要原因,除非它们既不具有转换性也不具有损耗性。

如果您想亲自查看,请修复代码并跟踪operator bool的调用。