我在Stack Overflow中发现这段代码只需几分钟。
我对代码中operator int&() { return i; }
的实际内容感到困惑。
#include <iostream>
#include <conio.h>
using namespace std;
class INT {
public:
INT(int ii = 0) : i(ii) {}
operator int&() { return i; }
void display()
{
cout << "value of i is : " << i;
}
private:
int i;
};
int main()
{
INT l;
cin >> l;
l.display();
getch();
return 0;
}
我添加了显示功能只是为了获得一些见解。我看到从cin >> l;
获得的值被分配给i
,它是对象l
的私有成员。所以这是
我想是某种超载。
你能让我知道我们能否直接通过cin
获取课堂对象的价值?它运作正常吗?
如果我int
的私有部分中有两个class INT
变量,该怎么办?
答案 0 :(得分:13)
operator int&() { return i; }
代码中的内容是什么?
Conversion Operator ;它接收INT
对象并返回对int
类型的引用。
只要编译器可以匹配函数参数等,就总是允许一次隐式转换
因此,只要有一个函数需要int
但INT
实例被传递给它,编译器就会使用这个转换运算符将INT
转换为int
,所以进行适当的转换并调用函数。
此类转换的用途是什么。它们对实用代码有帮助吗?
如第一个答案中所述,只要您的代码需要大量隐式转换,这就非常有用 请注意,如果没有这样的功能,则必须提供返回适当类型的特殊成员函数,并且用户必须明确地调用它们;这是很多编码开销,这个功能可以避免这种情况。
你能让我知道我们能否直接通过
cin
获取课堂对象的价值?它运作正常吗?
为了使cin>>l
起作用,
l
应该是>>
运算符因类型cin
而重载的数据类型(istream
)
请注意,大多数内置数据类型都会重载>>
,因此您可以直接使用,
cin>>i
,适用于i
为int
或float
的类型,等等。
但是,在你的例子中,
l
类型为INT
,>>
运算符未针对INT
数据类型重载。当然INT
是您的自定义类,标准C ++库实现在实现>>
的重载时无法知道它,因此不存在过载。
由于没有可用的>>
的重载版本,因此您无法直接使用>>
,编译器将返回无匹配函数的错误。
您必须提供 overload >> operator 作为独立功能,接收INT
,才能使用cin>>l
。
std::istream& operator>>(std::istream& is, INT& obj)
{
}