如何正确地重载<<运营商?

时间:2014-05-03 16:06:40

标签: c++ integer operator-overloading operators outputstream

我正在编写自己的整数类,可以处理任何大小的整数。到目前为止,我成功地重载了以下运算符:=,+, - ,*,/,%,>,<,> =,< =,==,!=,+ =, - =,* =,/ =和%=。

现在,我正在尝试重载<<运算符以模仿以下代码行中int的行为:

int a = 5;
std::cout << a;

我一直在研究如何做到这一点,到目前为止,我发现的是:

std::ostream& operator<<(std::ostream& os, const T& obj)
{
  // Write obj to stream
  return os;
}

但是,如果我想将某些东西流入我的对象(也就是说,在我的对象的右侧有<<),这似乎就是这样。但我想改变<<在我对象的左侧时的行为。

如何设置operator<<功能以允许我将数据流式传输到cout(或任何其他ostream)?

2 个答案:

答案 0 :(得分:2)

  

如何设置运算符&lt;&lt;函数允许我将数据流式传输到cout(或任何其他ostream)?

你在这里做的方式:

std::ostream& operator<<(std::ostream& os, const T& obj)
{
  // write obj to stream
  return os;
}

正如其他人在评论中有用地指出的那样,你需要将它放在整数类之外作为一个&#34;自由函数&#34;。它仍然可以是整数类的成员,但是,就是这样。

  

但是,如果我想将某些内容传输到我的对象中,这似乎就是这样。 (即具有&lt;&lt;&lt;&lt;&lt;&lt;&lt;&#;但我想改变&lt;&lt;的行为当它在我对象的左侧时。

我不确定你从哪里得到它,但第一个参数是左侧参数,它是你的情况下的输出流,第二个参数是你的整数类的实例,它被写入该输出流。

答案 1 :(得分:1)

在C ++流中,

std::cout << a;

只是

的语法糖
operator<<(std::cout, a);

匹配签名

std::ostream& operator<<(std::ostream& os, const int &a);

同样,

std::cout << myBigInt;

的语法糖
operator<<(cstd::cout, myBigInt);

因此,您发布的代码段启用了语法

os << obj; // os is an ostream; obj is a T

换句话说,<<位于obj和/或myBigInt的左侧,因为二元运算符介于函数参数列表中看到的两个操作数之间