这是看《Effective c++》时在VS上玩的代码。
#include <iostream>
using namespace std;
template<typename T>
class Rational{
public:
Rational(const T& numerator =0,const T& denominator = 1);
const T numerator() const;//不暴露私有变量给调用者修改
const T denominator() const;
//为了让类型转换可能发生于所有实参身上,需要non-member函数;
//为了让这个函数被自动具现化,需要将它声明在class内部
friend const Rational operator*(const Rational& lhs,const Rational& rhs)
{
return Rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());
}
/*
如果类内提供声明:
friend const Rational operator*(const Rational& lhs,const Rational& rhs);
然后在外部提供定义式:
template<typename T>
const Rational<T> operator*(const Rational<T>& lhs,const Rational<T>& rhs)
{
return Rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());
}
可是链接时不成功:无法解析的外部符号
"class Rational<int> const __cdecl operator*(class Rational<int> const &,class Rational<int> const &)"
*/
void print()
{
cout<<numerator()<<"/"<<denominator()<<endl;
}
private:
T num;
T deno;
};
template<typename T>
Rational<T>::Rational(const T& numerator,const T& denominator)
{
num = numerator;
deno = denominator;
}
template<typename T>
const T Rational<T>::numerator()const {
return num;
}
template<typename T>
const T Rational<T>::denominator()const {
return deno;
}
int main()
{
Rational<int> a (2,7);
Rational<int> b = a*2;//2被转换成Rational(2),分子赋值为2,分母没值默认为1
b.print();
Rational<int>c =a*a;
c.print();
return 0;
}