首页 > 编程语言 >C++面对对象:实现Fraction类,explicit ctor

C++面对对象:实现Fraction类,explicit ctor

时间:2023-02-27 00:44:18浏览次数:37  
标签:const int explicit denominator numerator C++ Fraction return

 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

相关文章

  • C++中的两种取反(!和~)
    在做算法题时经常用到这两种取反操作,下面对两种取反进行介绍和区别~主要用于按位取反,字面意义就是把这个数字的二进制每一位都取反,例如将(10001)按位取反有~(10001)=(01110)=(11......
  • c++中sort使用
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>usingnamespacestd;#include<algorithm>inta[100010],n;intmain(){scanf("%d",&n);for(inti=0;i<......
  • C++ 以及keil qt等常见软件注释 @brief @param @return
    brief 英[briːf] 美[briːf]adj. 短时间的;短暂的;简洁的;简单的;过短的;暴露身体的;n. 任务简介;指示;(向辩护律师提供的)案情摘要;委托辩护;辩护状;@brief......
  • C++快速求解最大公因数 | gcd库函数
    1.介绍gcd全称:greatestcommondivisor使用__gcd(intx1,intx2)函数可以高效、迅速得到x1,x2两个数的最大公因数。省去手写底层代码,专注代码逻辑的研究 2.注......
  • Turtlebot4入门教程-演示-创建节点(C++)
     说明:本教程将介绍创建ROS2包和用C++编写ROS2节点的步骤。有关Python示例,请单击此处。这些步骤与 ​​ROS2教程类似​​​,但侧重于与TurtleBot4的交互。​​......
  • c++函数模板
    函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数,其中的泛型可用具体的类型(如int或double)替换。例如如果定义一个2个数交换值的函数,如果2个数是int,那就需要定义一......
  • Understand C++ vtable from assembly code
    UnderstandC++vtablefromassemblycode(part1)AglanceatvtableimplementationPostedonMay30,2020tl;drForsimplicity,part1onlydiscus......
  • Windbg: going from vftable to c++ class
    Windbg:goingfromvftabletoc++class Aspartofanassignment,IamdelvingintotheworldofInternetExplorer,andamtryingtofigureoutexact......
  • C++中双冒号::的作用浅析
    C++中经常使用的作用符::,作用如下:(一)作用域限定符。在类体内申明函数,并在类体外定义函数时,必须在定义函数时加上类名和作用域限定符。classMyClass{public:int......
  • Memory leaks detection in a Windows Service written in C++
    MemoryleaksdetectioninaWindowsServicewritteninC++On January25,2020 By ArtemRazin In UncategorizedIntroductionThisarticlewilldemonstrate......