转换运算符和运算符>>

conversion operator and operator>>

本文关键字:运算符 gt 转换      更新时间:2023-10-16

我有一个程序如下:

class INT {
public:
  INT(int ii = 0) : i(ii) {}
  operator int() { return i; }
private:
  int i;
};
int main()
{
  INT i;
  cin >> i;
}

语句cin >> i是编译错误,但我不知道原因是什么?

在我的选项中,编译器可以找到该语句的函数cin.operator>>(int&),因为INT可以通过INT::operator int()转换为int

您可以通过更改int运算符使其返回引用来完成您想要做的事情:

operator int&() { return i; }

目前,您正在返回整数的副本,因此即使>>运算符有效,它也不会更改原始值。

operator int()返回一个临时变量,该变量不能绑定到operator>>所期望的对非常量的引用(因为它需要更改该变量)。

将其更改为operator int&(),并添加一个const过载作为operator int const&() const

我的建议是过载<lt;和>>作为好友,这样它就可以访问私有变量,并通过引用传入流。

class INT {
public:
  INT(int i = 0) : _i(i) {}
  const int& getValue()const {return _i;}
  void setValue(int i){_i=i;}
  friend istream& operator>>(istream& in, INT& myINT);
private:
  int _i;
};
friend istream& operator>>(istream& in, INT& myINT){
   int x;
   in >> x;
   myINT.setValue(x);
   return in;
}