c++中友元的一些总结(4)

全国等级考试资料网 2023-02-01 21:18:39 72
4,友元模板
如果想定义一系列函数为该类的友元,可以使用友元模板。它和模板的申明式类似,只是在template<>后加了friend关键字。
class A
{
public:
template
friend void foo();
};
5,能否做为定义式
能做为定义式的情况是:非受限,没有前至::,没有模板参数列表,没一对尖括号。如果是模板申明式,不能是首次申明,在该处必须是可见的。
6,一个完整的例子
template
class Rat
{
public:
Rat(T _a, T _b) : a(_a), b(_b) {}
friend Rat operator*(Rat&,Rat&);
private:
T a,b;
};
template
Rat operator*(Rat & x, Rat & y)
{
return Rat(x.a*y.a,x.b*y.b);
}
Rat< T >为T类型的有理数类,定义它的相乘运算,定义一个全局函数,并申明为友元,该函数也应该是模板,希望有如上的程序通过编译。在friend式之前没有operator*()的申明,所以这里不能是首次申明,在前面必须加上申明式:
template
Rat operator*(Rat & x, Rat & y);
在这之前又没有Rat的申明,再加上:
template
class Rat;
通过编译,或者改成友元模板:
template
class Rat
{
public:
Rat(T _a, T _b) : a(_a), b(_b) {}
template
friend Rat operator*(Rat&,Rat&);
private:
T a,b;
};
template
Rat operator*(Rat & x, Rat & y)
{
return Rat(x.a*y.a,x.b*y.b);
}
有细微的不同,Rat< T >申明了一系列友元operator*< UU >,当然没必要,只要 operator*< T >就够了,但是形式上简单一些。还有一种更简单的形式,就是将定义式放在里面,正是Effective C++里使用的方法:
template
class Rat
{
public:
Rat(T _a, T _b) : a(_a), b(_b) {}
friend Rat operator*(Rat&x,Rat&y) //定义并申明了::operator*()
{
return Rat(x.a*y.a,x.b*y.b);
}
private:
T a,b;
}; 相关资料

相关阅读