泛型编程(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 function
和non-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,Generic,numerator,denominator,Programming,int,Fraction,泛型 From: https://www.cnblogs.com/JunkingBoy/p/18106639
Fraction d2=f+4; // 因为已经声明成了explicit,所以运行时候会报错 -> conversion from 'double' to 'Fraction' reques