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



在以下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类的成员函数已被以某种方式调用。调用的成员函数具有标题为"运算符int((",因此,由于我没有在OBJ上操作并仅打印其值?

,该函数如何被调用?

编译器寻找有效的超载

operator<<(std::ostream&, something);

因为

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

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

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

实际上,这是提供此类类型转换操作员的确切原因:可以使用类型(在这种情况下为num(代替(几乎(conversion类型(几乎(任何功能呼叫,而无需显式呼叫键入转换。

代码

operator int(){
    return k;
}

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

因此,您可以做奇怪的事情:

int n = 10 + obj;

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

这进一步进一步...如果编译器需要<<,但是num不提供一个编译器,则编译器可以看到它可以将num转换为int,并且int具有<<。因此,编译器决定这样做。

个人操作:

能够自动将某种类型转换为另一种类型似乎很聪明。但是,这也令人困惑 - 尤其是对您的同事。因此,我建议避免隐式转换。如果您需要转换,则可以 explicity 。然后就不会有令人讨厌的惊喜。

最新更新