在以下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 。然后就不会有令人讨厌的惊喜。