函数和函数模版在一个。cpp中的情况!(除了左移和右移,其他的不要用友元函数!!!)

时间:2021-10-08 16:54:14
// 友元函数和运算符重载的碰撞.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;

结论:友元函数只用来进行左移友移操作符重载。