泛型编程(Generic Programming)

泛型编程(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
 
posted @ 2024-03-31 13:24  俊king  阅读(20)  评论(0)    收藏  举报