c++中友元的一些总结 |
1,友元模板 如果想定义一系列函数为该类的友元,可以使用友元模板 class A { public: template<typename T> friend void foo(); }; 2,能否做为定义式 能做为定义式的情况是:非受限,没有前至::,没有模板参数列表,没一对尖括号 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类型的有理数类,定义它的相乘运算,定义一个全局函数,并申明为友元,该函数也应该是模板,希望有如上的程序通过编译 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 >就够了,但是形式上简单一些 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; }; |
c++中友元的一些总结
最新推荐文章于 2025-08-13 19:57:41 发布