操作员在C++ "<<"超载

Operator overloading in C++ "<<"

本文关键字:lt 超载 C++ 操作员      更新时间:2023-10-16

我尝试在C++中重载运算符,但我遇到了一些困难。这是我在班上所拥有的:

ostream & operator <<(ostream & s)
 {
  s << w();
 return s;
}
 string w()
{
stringstream ss;
string str;
for (int i=n-1; i>=0; i--)
{
    if (i==n-1)
    {
        ss<<tablica[i] << "x^" << i;
    }
    else
    {
        if (tablica[i]<eps && tablica[i]>-eps) ss <<"+" << +tablica[i]<< "x^" << i;
        else if (tablica[i]<eps)ss << tablica[i]<< "x^" << i;
        if(tablica[i]>eps) ss <<"+" << +tablica[i]<< "x^" << i;
    }
}
ss >> str;
return str;
}

我正在尝试像这样使用它:

cout << p << endl;

错误:no match for 'operator<<' in 'std::cout << p这是我的整个程序代码:http://codepad.org/xBijPMCp

ostream & operator <<(ostream & s)应该在与特定类的关系中实现(使其有用(,因此签名应该是

friend ostream & operator <<(ostream & s, const class_name &c);

重载运算符以两种方式之一调用。要么作为成员函数,其中x op y;被视为x.op(y);,要么作为全局函数,其中x op y;变得op(x,y);

请注意,当运算符是成员函数时,左操作数必须是重载运算符的操作数。在插入到流中的情况下:x << y;,左操作数是流对象,因此要将运算符重载为成员函数,您必须作为流类的成员执行重载。

由于修改流类几乎是禁止的,因此您唯一真正的选择是将重载实现为全局函数。但是,在这种情况下,函数必须采用两个参数(一个用于左操作数,一个用于右操作数(。

因此,插入运算符几乎总是需要如下签名:

std::ostream &operator<<(std::ostream &os, T const &t)

(其中T是您要插入的任何类型(。

运算符重载是告诉编译器在一个或多个变量上使用相应的运算符时如何执行特定操作的能力。

例如,编译器在减法运算符方面的作用不同,-具体取决于运算符的使用方式。

  • 当它放在数值(如 -48(的左侧时,编译器会将该数字视为负值。
  • 在两个整数值(如 80-712(之间使用时,编译器将应用减法运算。
  • 在整数和双精度数字(如 558-9.27(之间使用时,编译器从右侧数字中减去左数字;运算将生成双精度数字。
  • -符号加倍并放置在变量的一侧时,例如--VariableVariable--,变量的值需要递减;换句话说,值1应从中减去。

所有这些操作都有效,因为减法运算符-已在各种类中重新配置以适当地执行操作。

你首先需要考虑你的总体设计。我认为您想重载<<以使用变量tablica的类型.operator<<()是一个二元运算符:声明的形式必须是: <<(Type t1, Type t2).(您是否希望它成为成员,这将"退化"到只有一个参数,因为第一个-左边,将是一种this(。在您的情况下,如下所示:

ostream & operator <<(ostream & s, const tablica_type &c);

你的 tablica 是一个全局变量,n 也是,有正态不是一个好主意。您可能希望定义一个包含 tablica 和 n 的类,并且对于此类覆盖 <<((。