学习侯捷老师,C++模板与泛型编程总结
Conversion function 转化函数
class Fraction
{
public:
Fraction(int num,int den=1)
:m_numerator(num),m_denominator(den){}
//转化函数可以加认为可以转化的所有函数,string ....
operator double()const{
return (double)(m_numerator/m_denominator);
}
private:
int m_numerator; //分子
int m_denominator;//分母
}
//使用、
Fraction f(3,4);
double d=f+4;
//编译器行为
//首先编译器会去找有么有 浮点数或者整数 + Fraction 类型的操作行为,没有,编译器再去寻找有没有f转为为double类型的操作, 选择使用operator double()const 函数
non_explicit-one-argument ctor
class Fraction
{
public:
Fraction(int num,int den=1)
:m_numerator(num),m_denominator(den){}
//转化函数设计为 + 分数
Fraction operator+(const Fraction& f)
{
return Fraction(....);
}
private:
int m_numerator; //分子
int m_denominator;//分母
}
//使用、将4通过构造函数一个实参转为为Fraction 再调用operator+
Fraction f(3,4);
double d=f+4;
//编译器行为
//首先编译器会去找有么有 浮点数或者整数 + Fraction 类型的操作行为,分数+ 与设计模式不同, 编译器再选择是否可以将4 转化为Fraction ,在调用operator+(cosnt Fraction &f)
class Fraction
{
public:
Fraction(int num,int den=1)
:m_numerator(num),m_denominator(den){}
//转化函数可以加认为可以转化的所有函数,string ....
operator double()const{
return (double)(m_numerator/m_denominator);
}
//转化函数设计为 + 分数
Fraction operator+(const Fraction& f)
{
return Fraction(....);
}
private:
int m_numerator; //分子
int m_denominator;//分母
}
//使用、 二义性
Fraction f(3,4);
Fraction d=f+4;
//编译器行为
//首先编译器会去找有么有 浮点数或者整数 + Fraction 类型的操作行为,有,编译器再去寻找有没有f转为为double类型的操作, 选择使用operator double()const 函数 编译器报错 二义性
explicit-one-argument ctor
class Fraction
{
public:
explict Fraction(int num,int den=1)
:m_numerator(num),m_denominator(den){}
//转化函数可以加认为可以转化的所有函数,string ....
operator double()const{
return (double)(m_numerator/m_denominator);
}
//转化函数设计为 + 分数
Fraction operator+(const Fraction& f)
{
return Fraction(....);
}
private:
int m_numerator; //分子
int m_denominator;//分母
}
//使用、 不会二义性
Fraction f(3,4);
Fraction d=f+4;
//编译器行为
//首先编译器会去找有么有 浮点数或者整数 + Fraction 类型的操作行为,失败 4转为为faction不允许,因为explict
,编译器再去寻找有没有f转为为double类型的操作, 选择使用operator double()const 函数 编