// 友元函数和运算符重载的碰撞.cpp : 定义控制台应用程序的入口点。 // #include <iostream> using namespace std; template <typename T> class sten_fri { public: sten_fri(T a); sten_fri & operator +(sten_fri &sf2); sten_fri & operator -(sten_fri & sf3); friend ostream & operator << <T>(ostream &out, sten_fri sf); protected: private: T a; }; template <typename T> sten_fri<T> ::sten_fri<T>(T a) { this->a = a; } template <typename T> sten_fri<T> & sten_fri<T>::operator +(sten_fri<T> &sf2) { this->a = this->a + sf2.a; return *this; } template <typename T> sten_fri<T> & sten_fri <T>::operator -(sten_fri<T> & sf3) { this->a = this->a - sf3.a; return *this; } template <typename T> ostream & operator << (ostream &out, sten_fri <T>sf) { out << sf.a << endl; return out; } int main() { //需要把模版类进行具体化之后,才能定义对象,因为c++要分配内存 sten_fri <int> a1(5); cout << a1;//这里的友元函数中ostream out中间必须加引用,要不然是错误的。 sten_fri <int> a2(2); a1 = a1 + a2; cout << a1; a1 = a1 - a2; cout << a2; system("pause"); return 0; }
//友元函数:友元函数不是实现函数重载(非 << >>)(特别麻烦,所以除了<< >>都不用)
//1)需要在类前增加 类的前置声明 函数的前置声明
template<typename T>
class Complex;
template<typename T>
Complex<T> mySub(Complex<T> &c1, Complex<T> &c2);
//2)类的内部声明 必须写成:
friend Complex<T> mySub <T> (Complex<T> &c1, Complex<T> &c2);
//3)友元函数实现 必须写成:
template<typename T>
Complex<T> mySub(Complex<T> &c1, Complex<T> &c2)
{
Complex<T> tmp(c1.a - c2.a, c1.b-c2.b);
return tmp;
}
//4)友元函数调用 必须写成
Complex<int> c4 = mySub<int>(c1, c2);
cout<<c4;
结论:友元函数只用来进行左移友移操作符重载。