"operator int&() { return i; } "在代码中做什么

What is "operator int&() { return i; } " doing in the code

本文关键字:代码 什么 return int operator      更新时间:2023-10-16

我在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中获取类对象的值吗?它工作正常吗?

如果我在class INT的私人部分有两个int变量怎么办?

operator int&() { return i; }在代码中做什么?

它是一个转换运算符;它接受一个INT对象并返回对int类型的引用。

每当编译器可以匹配函数参数等时,始终允许一个隐式转换。
因此,每当有一个函数接受int但将INT实例传递给它时,编译器就会使用此转换运算符将INT转换为int,以便进行适当的转换并且可以调用函数。

这种转换有什么用。它们在实际代码中有用吗?

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

你能告诉我我们可以直接从cin中获取类对象的值吗? 它工作正常吗?   

为了使cin>>l发挥作用, l应属于数据类型 cin>> 运算符重载的数据类型 ( istream (

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

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

您必须提供一个过载>>运算符作为独立的功能,接收INT,才能使用cin>>l

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