当执行此代码中的第二个语句时,内部会发生什么?

时间:2017-05-04 16:27:36

标签: c++ operator-overloading

在下面的C ++代码中,我正在创建一个类并在该类中声明一个私有变量。

#include <iostream>

class num{
    int k;
public:
    operator int(){
        return k;
    }
};

int main(){
    num obj;
    std::cout<<obj; // calls int()

    return 0;
}

执行时,此代码将在类型为num的'obj'中打印'k'的值。这清楚地表明,以某种方式调用了类num的成员函数。调用的成员函数有标题'operator int()',那么,这个函数是如何被调用的,因为我没有对obj进行操作而只打印它的值?

2 个答案:

答案 0 :(得分:3)

编译器查找

的有效重载
operator<<(std::ostream&, something);

operator<<(std::ostream&, num const&);

未定义/提供,它会查找任何允许的替代方案。由于num允许隐式类型转换为int,因此使用此方法,创建与

等效的代码
std::cout<<static_cast<int>(num);

实际上,这是提供这种类型转换运算符的确切原因:可以使用类型(在这种情况下为num)而不是(几乎)任何函数调用中的转换类型需要显式类型转换。

答案 1 :(得分:0)

代码

operator int(){
    return k;
}

num对象到int对象的转换。转换是隐式,这意味着它可以自动完成,即使您不要求它。换句话说 - 如果编译器需要int对象但具有num对象,编译器将自动调用int()num转换为int

因此你可以做一些奇怪的事情:

int n = 10 + obj;

void foo(int x)
{
    ....
}

foo(obj);

这更进一步......如果编译器需要<<num没有提供,编译器会发现它可以将num转换为{{1并且int有一个int。因此编译器决定这样做。

个人意见:

能够自动将某种类型转换为其他类型似乎很聪明。然而,它也令人困惑 - 特别是对你的同事。因此,我建议您避免隐式转换。如果您需要转化,请将其设为明确。然后就不会有令人讨厌的惊喜。