操作员在C++ "<<"超载
Operator overloading in C++ "<<"
我尝试在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(之间使用时,编译器从右侧数字中减去左数字;运算将生成双精度数字。
- 当
-
符号加倍并放置在变量的一侧时,例如--Variable
或Variable--
,变量的值需要递减;换句话说,值1应从中减去。
所有这些操作都有效,因为减法运算符-
已在各种类中重新配置以适当地执行操作。
你首先需要考虑你的总体设计。我认为您想重载<<
以使用变量tablica
的类型.operator<<()
是一个二元运算符:声明的形式必须是: <<(Type t1, Type t2).
(您是否希望它成为成员,这将"退化"到只有一个参数,因为第一个-左边,将是一种this
(。在您的情况下,如下所示:
ostream & operator <<(ostream & s, const tablica_type &c);
你的 tablica 是一个全局变量,n 也是,有正态不是一个好主意。您可能希望定义一个包含 tablica 和 n 的类,并且对于此类覆盖 <<((。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 寻找地理和伤害意味着超载
- 没有可行的超载'='用于shared_ptr
- "专业化不参与超载"
- 虚拟超载运算符>>和<<
- 为什么我的超载"+"运算符返回的总额错误?
- 如何显式调用运算符<<
- C++ 超载 += 用于两个袋子的合并,返回类型为空隙
- C++11 中对超载'ref(Select::Expressions::Code&)'的调用模棱两可
- 为什么STD :: SPAN超载函数调用操作员索引
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- &lt;&lt;&lt;的这些超载有什么区别操作员
- &lt;&lt;操作员在C 中超载错误
- 超载&LT的正确方法;操作员
- 在尝试超载&lt;&lt;时链接错误2005和1169操作员