返回类型<< C ++中的运算符重载函数

时间:2016-01-27 19:17:33

标签: c++ c++11 overloading

我创建了一个重载程序<<我班的操作员。 我对重载方法的返回类型有疑问。

当我从重载的操作符函数返回时,程序运行正常。

但是当我没有从函数中返回任何东西时,程序在一个条件下崩溃。

在许多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;

}

3 个答案:

答案 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;