在下面的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进行操作而只打印它的值?
答案 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
。因此编译器决定这样做。
个人意见:
能够自动将某种类型转换为其他类型似乎很聪明。然而,它也令人困惑 - 特别是对你的同事。因此,我建议您避免隐式转换。如果您需要转化,请将其设为明确。然后就不会有令人讨厌的惊喜。