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)
所以我从上面的代码中得到了两个问题.
你为什么要做return s;这个operator+ (int left, student& s)功能?你为什么不能把返回类型放在那里void因为你已经通过student引用传递对象了?
似乎每当我放下endl后14 + a我都会收到错误,我发现了一个错误并且没有打印.我知道这与`operator <<'有关,但我不知道它的确切原因,你怎么防止这种情况发生?
你为什么要做回报; 在运算符+(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对象.