#ifndef MYTIME0_H_ #define MYTIME0_H_ classTime { private: int hours; int minutes; public: Time(); Time(int h, int m = 0); voidAddMin(int m); voidAddHr(int h); voidReset(int h = 0, int m = 0); Time Sum(const Time & t)const; voidShow()const; }; #endif
Time Time::operator+(double n) const { Time sum; sum.minutes = minutes * n % 60; sum.hours = hours + minutes * n / 60; sum.hours = sum.hours % 24; return sum; }
上述可以 使用 A = B * 0.75 但是无法用来实现 A = 0.75 * B,这样不就和普通的 * 不一样了吗
友元就是为了解决这个问题,步骤如下
将其原型放在类声明中,并在原型声明前加上关键字 friend
1 2
friend Time operator*(double m, const Time & t); //gose in class declaration //friend Time operator*(double n, const Time & t) const; //x 非成员函数上不允许使用类型限定符
Time operator*(double m, const Time & t) //friend not used in definition { Time sum; sum.minutes = minutes * m % 60; sum.hours = hours + minutes * m / 60; sum.hours = sum.hours % 24; return sum; }
有了上述声明和定义后,就可以使用 A = 2.75 * B 了
1 2 3 4 5 6 7 8
Time operator*(double m, const Time & t) //friend not used in definition { Time sum; sum.minutes = t.minutes % 60; sum.hours = t.hours + t.minutes * m / 60; sum.hours = sum.hours % 24; return sum; }
由于不是成员函数,所以不能直接使用 sum.minutes = minutes % 60;
1 2
total = coding * 0.75; //错误,没有与这些操作数匹配的 "*" 运算符 total = 0.25 * coding;