就业数据资源平台
当前位置:首页 > C语言程序设计
c++中友元的一些总结(4)

  4,友元模板
  如果想定义一系列函数为该类的友元,可以使用友元模板。它和模板的申明式类似,只是在template<>后加了friend关键字。
  class A
  {
  public:
  template<typename T>
  friend void foo();
  };
  5,能否做为定义式
  能做为定义式的情况是:非受限,没有前至::,没有模板参数列表,没一对尖括号。如果是模板申明式,不能是首次申明,在该处必须是可见的。
  6,一个完整的例子
  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类型的有理数类,定义它的相乘运算,定义一个全局函数,并申明为友元,该函数也应该是模板,希望有如上的程序通过编译。在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 >就够了,但是形式上简单一些。还有一种更简单的形式,就是将定义式放在里面,正是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;
  };
就业数据资源平台