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

发布时间:2019-02-04 19:00:53

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;
};
阅读更多其他试题,请访问生活日记网 用日志记录点滴生活!考试试题频道。
喜欢考试试题,那就经常来哦

该内容由生活日记网提供.