什么是“operator int&(){return i;}”在代码中执行

时间:2012-02-25 13:57:21

标签: c++

我在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变量,该怎么办?

1 个答案:

答案 0 :(得分:13)

  

operator int&() { return i; }代码中的内容是什么?

Conversion Operator ;它接收INT对象并返回对int类型的引用。

只要编译器可以匹配函数参数等,就总是允许一次隐式转换 因此,只要有一个函数需要intINT实例被传递给它,编译器就会使用这个转换运算符将INT转换为int,所以进行适当的转换并调用函数。

  

此类转换的用途是什么。它们对实用代码有帮助吗?

如第一个答案中所述,只要您的代码需要大量隐式转换,这就非常有用 请注意,如果没有这样的功能,则必须提供返回适当类型的特殊成员函数,并且用户必须明确地调用它们;这是很多编码开销,这个功能可以避免这种情况。

  

你能让我知道我们能否直接通过cin获取课堂对象的价值?它运作正常吗?

为了使cin>>l起作用, l应该是>>运算符因类型cin而重载的数据类型(istream

请注意,大多数内置数据类型都会重载>>,因此您可以直接使用, cin>>i,适用于iintfloat的类型,等等。

但是,在你的例子中, l类型为INT>>运算符未针对INT数据类型重载。当然INT是您的自定义类,标准C ++库实现在实现>>的重载时无法知道它,因此不存在过载。
由于没有可用的>>的重载版本,因此您无法直接使用>>,编译器将返回无匹配函数的错误。

您必须提供 overload >> operator 作为独立功能,接收INT,才能使用cin>>l

std::istream& operator>>(std::istream& is, INT& obj) 
{

}