首页 > 编程语言 >泛型编程(Generic Programming)

泛型编程(Generic Programming)

时间:2024-03-31 13:33:36浏览次数:26  
标签:__ FRACTION Generic numerator denominator Programming int Fraction 泛型

泛型编程(Generic Programming)

  • 虚函数 -> 含有虚函数的类就是抽象类

  • 编译(compile)

  • 链接(link)

转换函数(Conversion function)

例如将小数转成分数,就是一个转换函数

#pragma once
#ifndef __FRACTION__
#define __FRACTION__

class Fraction
{
public:
// 分母不为0,所以默认值是1
Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {}
operator double() const { return(double)(m_numerator / m_denominator); }
private:
// 设计分子分母
int m_numerator;
int m_denominator;
};

#endif // !__FRACTION__

调用:

Fraction f(3, 5);
double d=4+f; // 编译器先去找是否定义+操作符重载进行+的操作.如果没有再去找是否定义f的转换
// double()将f转为0.6再进行相加

另一个设计:

#pragma once
#ifndef __FRACTION__
#define __FRACTION__

class Fraction
{
public:
// 分母不为0,所以默认值是1
Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {}
// 定义+ -> 分数相加,转为同分母分数再相加
Fraction operator+(const Fraction& f) {
(((this->m_numerator * f.m_denominator) + (this->m_denominator * f.m_numerator)) / this->m_denominator * f.m_denominator);
}
private:
// 设计分子分母
int m_numerator; // 分子
int m_denominator; // 分母
};

#endif // !__FRACTION__

调用:

Fraction f(3, 5);
Fraction d2=f+4; // 这个加法会先调用Fraction构造函数将4转为Fraction(4, 1)
// 然后调用operator+

如果conversion functionnon-explicit-one-argument ctor并存那么编译会报错 -> 因为调用的解决方式有两种.就会歧义,就会报错

explict

指定告诉编译器这里仅作为构造函数的时候才可以使用

示例代码:

#pragma once
#ifndef __FRACTION__
#define __FRACTION__

class Fraction
{
public:
// 分母不为0,所以默认值是1
explicit Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {}
operator double() const { return(double)(m_numerator / m_denominator); }
// 定义+ -> 分数相加,转为同分母分数再相加
Fraction operator+(const Fraction& f) {
(((this->m_numerator * f.m_denominator) + (this->m_denominator * f.m_numerator)) / this->m_denominator * f.m_denominator);
}
private:
// 设计分子分母
int m_numerator; // 分子
int m_denominator; // 分母
};

#endif // !__FRACTION__

调用:

Fraction f(3, 5);
Fraction d2=f+4; // 因为已经声明成了explicit,所以运行时候会报错 -> conversion from 'double' to 'Fraction' reques
 

标签:__,FRACTION,Generic,numerator,denominator,Programming,int,Fraction,泛型
From: https://www.cnblogs.com/JunkingBoy/p/18106639

相关文章

  • C语言实现半定规划(Semidefinite Programming, SDP)算法
    目录前言A.建议B.简介一代码实现A.半定规划的基本概念B.使用C语言进行半定规划建模二时空复杂度A.时间复杂度B.空间复杂度C.实际考虑三优缺点A.优点B.缺点C.总结四现实中的应用前言A.建议1.学习算法最重要的是理解算法的每一步,而不是记住算法。2.......
  • java 异常类+常用类+容器、泛型
    目录一、.异常类:1.捕获和处理异常:2.抛出: 3.自定义异常类:二、包装类、String、BigDecimal1.包装类:2.String:3.BigDecimal:三、泛型、列表、set、map:1.泛型:2.列表:3.set:4.map:一、.异常类:异常是程序运行过程中可能出现的错误情况或有别于一般情况的情况。而java......
  • delphi ORM和泛型模板
    delphiORM和泛型模板实现CRUD1)定义数据模型(data-model)数据模型是ORM数据序列/还原所必需的。TTable<T:record>=record//1个表rows:TArray<T>;//表的行end;TTable2<T,T2:record>=record//2个表table1:TTable<T>;......
  • The 19th Zhejiang Provincial Collegiate Programming Contest
    目录写在前面CBALMGIFJ写在最后写在前面比赛地址:https://codeforces.com/gym/103687。以下按照个人向难度排序JustaWay闪击珞珈之初次合作。理应能7题,但是赛时开局罚烂中期烂了两题导致后面的没法写被迫五题下班妈的唉牢鱼想你了C纯签到,建议评级:200///*By:Luckybl......
  • 泛型的进阶
    1通配符?我们想调用fun函数帮我们打印,但由于不知道Message具体是什么类型,所以我们可以使用:?即通配符当我们将fun函数中改为Message<?>此时就不会报错2通配符的上界:<?extends上界>Demo:<?extendsFruit>意思是传入的实参需要是Fruit或者Fruit的子类当我们用通配......
  • 容器一(泛型、Collection 接口)
    目录泛型Generics自定义泛型容器中使用泛型Collection接口泛型Generics        泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编......
  • 泛型编程之模板
    1.函数模板重要行:template<typenameT,typenameT1>关键值class和typename含义相同,那么我们以后就使用typename即可。 一般情况下的格式:template<模板参数列表>返回值类型函数名(函数参数) 模板参数列表的理解:函数参数列表在运行时调用者用实参来初始化形参而......
  • 消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设
    消息sms邮箱/手机号/push发送的方案&定时任务xxlJob灵活度&泛型和发送的模板类设计1.消息sms邮箱/手机号/push发送的方案1.判断收件人地址是否为空,不为空则发送邮件。为空则不发送。可以通过该方法终止一些消息的发送。2.收件人的地址可以配置在Apollo中,直接删除该key......
  • TypeScript学习笔记之泛型
    介绍软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据......
  • UNIQUE VISION Programming Contest 2024 Spring(AtCoder Beginner Contest 346)
    C我们用\(1\simK\)的和减去出现在\(1\simK\)中的数的和。intn,k,a[N],res;map<int,int>vis;signedmain(){ cin>>n>>k; _for(i,1,n)cin>>a[i]; res=k*(1+k)/2; _for(i,1,n)if(a[i]>=1&&a[i]<=......