[英]Return type of << operator overloading function in C++
我已经创建了一个程序来为我的课重载<<运算符。 我对重载方法的返回类型有疑问。
当我从重载的运算符函数返回时,程序运行正常。
但是,当我没有从函数返回任何东西时,程序在一种情况下崩溃。
在许多C ++资源中,我已经读到,在级联时,返回类型对于打印操作符是必需的。
条件1:通过时我正在使用语句
// cout<<"\\n"<<mv1<<mv2<<mv3;
一切正常。 传递而没有从重载函数返回。
条件2:失败时,我正在使用statemtent cout <<“ \\ n” <
我知道返回不存在,因此程序在运行时崩溃。
但是问题是什么使程序在条件1中运行。 即使没有return语句,重载函数中也不存在。
I have create a program to overload << operator for my class.
我对重载方法的返回类型有疑问。
当我从重载的运算符函数返回时,程序运行正常。
但是,当我没有从函数返回任何东西时,程序在一种情况下崩溃。
在许多C ++资源中,我已经读到,在级联时,返回类型对于打印操作符是必需的。
条件1:通过时我正在使用语句
// cout<<"\\n"<<mv1<<mv2<<mv3;
一切正常。 传递而没有从重载函数返回。
条件2:失败时,我正在使用statemtent cout <<“ \\ n” <
我知道返回不存在,因此程序在运行时崩溃。
但是问题是什么使程序在条件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;
}
此代码具有未定义的行为 。
这真是太糟了。 通常,这意味着将发生崩溃(但从技术上讲,任何事情都可能发生)。
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<<
返回一个void,所以第二次调用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;
}
是的,您总是返回传入的ostream,并且可能希望将const
引用传递给要输出的值:
ostream& operator<<(ostream &out, const myvar& n)
{
out << "(" << n.var_x << "," << n.var_y << ")";
return out;
}
我最大的疑问是,为什么在下面的语句中链接<<
即使没有从重载函数返回out仍在工作。
cout<<"\n"<<mv1<<mv2<<mv3;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.