1 //Fraction.h 2 #pragma once 3 #include <iostream> 4 #include <string> 5 6 using namespace std; 7 8 class Fraction; 9 int __gcd(int, int); 10 11 class Fraction { 12 public: 13 explicit Fraction(int num, int den = 1): m_numerator(num), m_denominator(den) { 14 int t = __gcd(num, den); 15 //约分 16 m_numerator /= t; 17 m_denominator /= t; 18 } 19 20 operator double() const { return (double)m_numerator / m_denominator; } //conversion function 转换函数 21 double operator +(const double& d) const { return (double)m_numerator / m_denominator + d; } 22 Fraction operator +(const Fraction&) const; 23 operator string() const { return to_string(m_numerator) + '/' + to_string(m_denominator); } //转换函数 24 25 private: 26 int m_numerator; 27 int m_denominator; 28 29 friend int __gcd(int, int); 30 }; 31 32 Fraction Fraction::operator +(const Fraction& f) const { 33 //a/c + b/d = (ad + bc) / cd 34 int num = m_numerator * f.m_denominator + m_denominator * f.m_numerator; 35 int den = m_denominator * f.m_denominator; 36 return Fraction(num, den); 37 } 38 39 inline int __gcd(int a, int b) { 40 /* 41 while (a % b != 0) { 42 int t = a % b; 43 a = b; 44 b = t; 45 } 46 return b; 47 */ 48 return b == 0 ? a : __gcd(b, a % b); 49 }
1 //Fraction.cpp 2 #include "Fraction.h" 3 4 int main() { 5 //conversion function 6 Fraction f0(3); 7 Fraction f1(3, 2); 8 Fraction f2(9, 6); 9 cout << f0 << " " << f1 << " " << f2 << " " << string(f1) << " " << string(f2) << endl; 10 cout << f0 + f1 << endl; 11 cout << f1 + 2.7 << endl; 12 13 Fraction f3(f0 + f2); 14 Fraction f4 = f0 + f2; 15 double f5 = f0 + 2.1; 16 //Fraction f6 = f0 + 2.1; //non-explicit ctor时, 情况一: 2.1由double转换为Fraction, 情况二: f6由double转换为Fraction, 会引起ambiguous Err 17 //Fraction f7 = f0 + 2.1; //explicit ctor时, double转化为Fraction的隐式转换被禁用, 本行报错 18 cout << f3 << " " << f4 << " " << f5 << endl; 19 //cout << f6 << " " << f7 << endl; 20 21 return 0; 22 }
标签:const,int,explicit,denominator,numerator,C++,Fraction,return From: https://www.cnblogs.com/karinto/p/17158333.html