c++中友元的一些总结

c++中友元的一些总结
 

 

  1,友元模板

  如果想定义一系列函数为该类的友元,可以使用友元模板嵌入式培训,LINUX培训,C培训,Wince培训,Android培训它和模板的申明式类似,只是在template<>后加了friend关键字嵌入式培训,LINUX培训,C培训,Wince培训,Android培训

  class A

  {

  public:

  template<typename T>

  friend void foo();

  };

  2,能否做为定义式

  能做为定义式的情况是:非受限,没有前至::,没有模板参数列表,没一对尖括号嵌入式培训,LINUX培训,C培训,Wince培训,Android培训如果是模板申明式,不能是首次申明,在该处必须是可见的嵌入式培训,LINUX培训,C培训,Wince培训,Android培训

  3,一个完整的例子

  template<typename T>

  class Rat

  {

  public:

  Rat(T _a, T _b) : a(_a), b(_b) {}

  friend Rat<T> operator*<T>(Rat<T>&,Rat<T>&);

  private:

  T a,b;

  };

  template<typename T>

  Rat<T> operator*(Rat<T> & x, Rat<T> & y)

  {

  return Rat<T>(x.a*y.a,x.b*y.b);

  }

  Rat< T >为T类型的有理数类,定义它的相乘运算,定义一个全局函数,并申明为友元,该函数也应该是模板,希望有如上的程序通过编译嵌入式培训,LINUX培训,C培训,Wince培训,Android培训在friend式之前没有operator*()的申明,所以这里不能是首次申明,在前面必须加上申明式:

  template<typename T>

  Rat<T> operator*(Rat<T> & x, Rat<T> & y);

  在这之前又没有Rat的申明,再加上:

  template<typename T>

  class Rat;

  通过编译,或者改成友元模板:

  template<typename T>

  class Rat

  {

  public:

  Rat(T _a, T _b) : a(_a), b(_b) {}

  template<typename UU>

  friend Rat<UU> operator*(Rat<UU>&,Rat<UU>&);

  private:

  T a,b;

  };

  template<typename T>

  Rat<T> operator*(Rat<T> & x, Rat<T> & y)

  {

  return Rat<T>(x.a*y.a,x.b*y.b);

  }

  有细微的不同,Rat< T >申明了一系列友元operator*< UU >,当然没必要,只要 operator*< T >就够了,但是形式上简单一些嵌入式培训,LINUX培训,C培训,Wince培训,Android培训还有一种更简单的形式,就是将定义式放在里面,正是Effective C++里使用的方法:

  template<typename T>

  class Rat

  {

  public:

  Rat(T _a, T _b) : a(_a), b(_b) {}

  friend Rat<T> operator*(Rat<T>&x,Rat<T>&y) //定义并申明了::operator*()

  {

  return Rat<T>(x.a*y.a,x.b*y.b);

  }

  private:

  T a,b;

  };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值