重载运算符和友元函数

时间:2017-04-18 22:00:48

标签: c++ operator-overloading friend-function

我在使用重载运算符实现友元函数时遇到问题。我对使用这些函数需要什么没有充分的理解。如果有人能给我一些如何进行的指导。请提前谢谢你。 说明:

O(1)

我的代码:

This class implements rational number of the type 2/3.

class Rational;

private data: int n, (fraction numerator)
int d (fraction denominator).

//   make sure that d is always positive.

//  optional:   always simplify the number so that n and d don't have a common factor


public interface:
constructors:
two int args, to allow setting rational to any legal value
default numerator to be 0, default denominator to be 1

friend istream& operator >>(istream& in_str, Rational& right)

friend ostream& operator <<(ostream& out_str, cnst Rational& right)



overload + - * / <  <=  > >=   ==

friend Rational operator+(const Rational&, const Rational&);
....


*/ 
/*
A possible test and output is given below.

int main()
{
cout << "Testing declarations" << endl;
cout << "Rational x, y(2), z(-5,-6), w(1,-3);" << endl;
Rational x, y(2), z(-5, -6), w(1, -3);
cout << "x = " << x << ", y = " << y << ",  z = " << z
<< ", w = " << w << endl << endl;



cout << "Testing the constructor and normalization routines: " << endl;
y = Rational(-1, -4);
cout << "y =Rational(-1, -4) outputs as " << y << endl;
y = Rational(-1, 4);
cout << "y =Rational(-1, 4)outputs as " << y << endl;
y = Rational(1, -4);
cout << "y = Rational(128, -48) outputs as " << y << endl;
Rational a(1, 1);
cout << "Rational a(1,1); a outputs as: " << a << endl;
Rational ww = y*a;
cout << y << " * " << a << " = " << ww << endl << endl;

cout << "Testing >> overloading: \nEnter "
<< "a fraction in the format "
<< "integer_numerator/integer_denominator"
<< endl;
cin >> x;
cout << "You entered the equivalent of: " << x << endl;
cout << z << " -  (" << w << ") = " << z - w << endl << endl;



w = Rational(-7, 3);
z = Rational(-3, 5);
cout << "Testing arithmetic and relational "
<< " operator overloading" << endl << endl;
cout << w << " * " << z << " = " << w * z << endl;
cout << w << " + " << z << " = " << w + z << endl;
cout << w << " - " << z << " = " << w - z << endl;
cout << w << " / " << z << " = " << w / z << endl;

cout << w << " <  " << z << " : " << (w < z) << endl;

cout << w << " <= " << z << " : " << (w <= z) << endl;
cout << w << " <= " << w << " : " << (w <= w) << endl;

cout << w << " >  " << z << " : " << (w > z) << endl;
cout << w << " > " << w << " : " << (w > w) << endl;
cout << w << " >= " << z << " : " << (w >= z) << endl;

return 0;
}

== == == == == == == == ==

TestingTesting declarations
Rational x, y(2), z(-5, -6), w(1, -3);
x = 0 / 1, y = 2 / 1, z = 5 / 6, w = -1 / 3

Testing the constructor and normalization routines :
y = Rational(-1, -4) outputs as 1 / 4
y = Rational(-1, 4)outputs as - 1 / 4
y = Rational(128, -48) outputs as - 1 / 4
Rational a(1, 1); a outputs as : 1 / 1
- 1 / 4 * 1 / 1 = -1 / 4

Testing >> overloading :
    Enter a fraction in the format integer_numerator / integer_denominator
    2 / -3
    You entered the equivalent of : -2 / 3
    5 / 6 - (-1 / 3) = 21 / 18

    Testing arithmetic and relational  operator overloading

    - 7 / 3 * -3 / 5 = 21 / 15
    - 7 / 3 + -3 / 5 = -44 / 15
    - 7 / 3 - -3 / 5 = -26 / 15
    - 7 / 3 / -3 / 5 = 35 / 9
    - 7 / 3 <  -3 / 5 : 1
    - 7 / 3 <= -3 / 5 : 1
    - 7 / 3 <= -7 / 3 : 1
    - 7 / 3 >  -3 / 5 : 0
    - 7 / 3 > -7 / 3 : 0
    - 7 / 3 >= -3 / 5 : 0

*/

1 个答案:

答案 0 :(得分:0)

以这种方式思考....在您的示例中,您并没有真正重载类中的方法,而是重载运算符&gt;&gt;对于溪流。 你必须把它变成朋友才能实现

istream& operator >> (istream& in_str, Rational& right)

,其他流操作员可以查看您班级的成员数据。它们不是您的类的方法,而是定义为全局函数。如果他们不是朋友功能,他们就无法看到他们需要使用的私人数据。

参见https://isocpp.org/wiki/faq/friendshttps://isocpp.org/wiki/faq/operator-overloading

这是使用关键字“朋友”几乎可以接受的次数之一。 “朋友”在所有情况下都是不受欢迎的,但是在实施工厂模式的时候。

对于某些对比,google“C ++重载operator =”这是一种类方法,因此不需要成为朋友。