繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM