重载operator <<和operator +导致错误

slo*_*low 2 c++ operator-overloading

class student
{
 private:
     int age;
 public:
     student();
     student(int a) {age = a;}
     ~student() {};
     friend student& operator+ (int left, student& s);
     friend ostream& operator<< (ostream& o, student& s);
}

...

student& operator + (int left, student& s)
{
    s.age += left;
    return s;
}

ostream& operator<< (ostream& o, student& s)
{
    o << s.age << endl;
}


int main (void)
{ 
    student a (10);
    cout << 14 + a ;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我从上面的代码中得到了两个问题.

  1. 你为什么要做return s;这个operator+ (int left, student& s)功能?你为什么不能把返回类型放在那里void因为你已经通过student引用传递对象了?

  2. 似乎每当我放下endl14 + a我都会收到错误,我发现了一个错误并且没有打印.我知道这与`operator <<'有关,但我不知道它的确切原因,你怎么防止这种情况发生?

And*_*owl 6

你为什么要做回报; 在运算符+(int left,student&s)函数中?

我必须说你的定义operator +是奇怪的,因为它修改了右边的对象 - 虽然operator +通常没有,并且按值返回一个新对象.

无论如何,operator +通常不会返回,void因此它允许链接,如:

14 + (16 + a)
Run Code Online (Sandbox Code Playgroud)

但同样,operator +不应该修改右侧对象.你可能想要写一些类似的东西operator +=.考虑改变你的定义operator +.

似乎每当我在14 + a之后放置endl时我都会收到错误,我发现错误而且没有打印.我知道这与`operator <<'有关,但我不知道它的确切原因,你怎么防止这种情况发生?

您的程序具有未定义的行为,因为您的重载operator <<不会返回任何内容.你应该添加一个return语句:

ostream& operator<< (ostream& o, student const& s)
//                                       ^^^^^
{
    o << s.age << endl;
    return o;
//  ^^^^^^^^^ <== Without this, your program has undefined behavior.
//                Value-returning functions MUST return a value (with
//                the only exception of main())
}
Run Code Online (Sandbox Code Playgroud)

此外,如上面做,你应该接受的student参照对象const,因为operator <<不会改变其状态(如果你没有这样做,你不能使用operator <<同一个const对象.

  • +1并且还将`operator <<`中的参数类型更改为`student const&`. (2认同)