我创建了一个重载程序<<我班的操作员。 我对重载方法的返回类型有疑问。
当我从重载的操作符函数返回时,程序运行正常。
但是当我没有从函数中返回任何东西时,程序在一个条件下崩溃。
在许多C ++资源中,我已经读过,返回类型是在级联中打印运算符所必需的。
条件1:过世 当我使用声明时
// cout<<"\n"<<mv1<<mv2<<mv3;
一切都很好。从重载函数返回而不返回。
条件2:失败 当我使用statemtent COUT&LT;&LT; “\ n” &LT;
我知道返回不存在,所以程序在运行时崩溃了。
但问题是使程序在条件1中运行的原因。即使没有return语句也没有出现在重载函数中。
I have create a program to overload << operator for my class.
我对重载方法的返回类型有疑问。
当我从重载的操作符函数返回时,程序运行正常。
但是当我没有从函数中返回任何东西时,程序在一个条件下崩溃。
在许多C ++资源中,我已经读过,返回类型是在级联中打印运算符所必需的。
条件1:过世 当我使用声明时
// cout<<"\n"<<mv1<<mv2<<mv3;
一切都很好。从重载函数返回而不返回。
条件2:失败 当我使用statemtent COUT&LT;&LT; “\ n” &LT;
我知道返回不存在,所以程序在运行时崩溃了。
但问题是使程序在条件1中运行的原因。即使没有return语句也没有出现在重载函数中。
#include <iostream>
#include <stdio.h>
using namespace std;
class myvar{
private:
int var_x,var_y;
public:
friend ostream& operator<<(ostream &out,myvar n);
void setvalue(int x,int y)
{
var_x = x ;
var_y = y ;
}
};
ostream& operator<<(ostream &out,myvar n)
{
cout<<"("<<n.var_x<<","<<n.var_y<<")";
//return out;
}
int main()
{
myvar mv1,mv2,mv3;
mv1.setvalue(10,20);
mv2.setvalue(30,40);
mv3.setvalue(50,60);
//Working
// cout<<"\n"<<mv1<<mv2<<mv3;
//Not Working
// cout<<"\n"<<mv1<<mv2<<mv3<<"Hello"<<1243<<11.5;
}
答案 0 :(得分:2)
此代码有未定义的行为 这真是太糟了。通常这意味着会发生崩溃(但从技术上讲,任何事情都可能发生)。
ostream& operator<<(ostream &out,myvar n)
{
out<<"("<<n.var_x<<","<<n.var_y<<")"; // fixed cout to out.
//return out;
}
这是因为您在函数签名中指定了返回类型。
ostream& operator<<(ostream &out,myvar n)
^^^^^^^^
如果您的功能不包含return
关键字,那么您的代码无效。因此,对于定义的函数(使用注释掉的返回),您的程序很可能会崩溃。
如果您将代码更改为:
void operator<<(ostream &out,myvar n)
{
out<<"("<<n.var_x<<","<<n.var_y<<")";
}
现在它将编译(有效)并且正常工作 但结果是你无法将流操作链接在一起。
myvar x;
// Set some value in x
// This will work fine.
std::cout << x;
// But this will fail to compile.
std::cout << x << " Another Thing";
因为第一次调用operator<<
会返回空格,所以第二次调用operator<<
不知道该怎么做。
因此,最好的办法是返回流以允许链接。
ostream& operator<<(ostream &out,myvar n)
{
out<<"("<<n.var_x<<","<<n.var_y<<")";
return out;
}
PS:一些空格字符对于提高可读性非常好。
// This is easier to read for a human.
std::ostream& operator<<(std::ostream &out, myvar n)
{
out << "(" << n.var_x << "," << n.var_y << ")";
return out;
}
答案 1 :(得分:1)
是的,你总是返回传入的ostream,可能想要传递一个const
引用你要输出的值:
ostream& operator<<(ostream &out, const myvar& n)
{
out << "(" << n.var_x << "," << n.var_y << ")";
return out;
}
答案 2 :(得分:0)
我最大的疑问是为什么链接&lt;&lt;在以下声明中
即使没有从重载函数返回,仍在工作。
cout<<"\n"<<mv1<<mv2<<mv3;