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

Return type of << operator overloading function in C++

本文关键字:lt 返回类型 函数 重载 C++ 运算符      更新时间:2023-10-16

我创建了一个程序来重载<<我的类运算符。我对重载方法的返回类型有疑问。

当我从重载运算符函数返回 out 时,程序工作正常。

但是当我没有从函数中返回任何内容时,程序在一种情况下崩溃。

在许多C++资源中,我读到返回类型对于级联打印运算符是必需的。

条件1:通过 当我使用语句时

// cout<<"n"<<mv1<<mv2<<mv3; 一切都很好。从重载函数传递而不返回。

条件 2:失败当我使用状态时cout<<""<<p>我知道返回不存在,因此程序在运行时崩溃。

但问题是是什么让程序在条件 1 中运行。即使没有 return 语句,重载函数中也不存在。

以下程序

I have create a program to overload << operator for my class.

我对重载方法的返回类型有疑问。

当我从重载运算符函数返回 out 时,程序工作正常。

但是当我没有从函数中返回任何内容时,程序在一种情况下崩溃。

在许多C++资源中,我读到返回类型对于级联打印运算符是必需的。

条件1:通过 当我使用语句时

// cout<<"n"<<mv1<<mv2<<mv3; 一切都很好。从重载函数传递而不返回。

条件 2:失败当我使用状态时cout<<""<<p>我知道返回不存在,因此程序在运行时崩溃。

但问题是是什么让程序在条件 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;
} 

我最大的疑问是为什么要在下面的语句中链接<<

即使没有从过载功能返回,也可以工作。

cout<<"n"<<mv1<<mv2<<mv3;