friend.cppRUN

//friend的示例
#include <iostream>

class Vector
{
public:
	Vector() { x = y = 0; }
	Vector(double x, double y) { this->x = x, this->y = y; }

	//友元函数。并不是类Vector的成员函数。函数operator+内部可以自由访问Vector的私有成员
	friend Vector operator+(double x, const Vector & second);
	friend class CTest; //CTest域中可以自由访问Vector的私有成员
private:
	double x, y;
};

Vector operator+(double x, const Vector & second)
{
	Vector result(x+second.x, second.y);
	return result;
}

class CTest
{
public:
	void Show(const Vector & v)const
	{
		std::cout << v.x << v.y << std::endl;
	}
};

//模板类里的友元
template< class T >
class TVector2
{
private:
	T x, y;
public:
	TVector2()
	{
		x = 0;
		y = 0;
	}

	TVector2(T x, T y)
	{
		this->x = x;
		this->y = y;
	}

	T Magnitude()const
	{
		return T(sqrt(x * x + y * y));
	}

	// 友元函数,不是类的函数,但写在类里
	template< class T > friend std::ostream& operator<<(std::ostream& os, const TVector2<T>& v)
	{
		os << v.x << ", " << v.y << std::endl;
		return os;
	}

	// 友元函数,不是类的函数,但写在类里
	template< class T > friend std::istream& operator>>(std::istream& is, TVector2<T>& v)
	{
		is >> v.x >> v.y;
		return is;
	}

	// 友元函数,不是类的函数,写在类外,此处为friend申明
	template< class T > friend T operator*(const TVector2<T>& v1, const TVector2<T>& v2);

	//错误
	// friend template< class T > T operator*(const TVector2<T>& v1, const TVector2<T>& v2); 

	// 错误
	// friend T operator*(const TVector2<T>& v1, const TVector2<T>& v2); 
};
typedef TVector2<float> Vector2f;
typedef TVector2<double> Vector2;

//点乘,写在类外
template < class T >
T operator*(const TVector2<T>& v1, const TVector2<T>& v2)
{
	return v1.x * v2.x + v1.y + v2.y;
}

void TestTVector()
{
	Vector2 v1, v2;
	std::cin >> v1 >> v2;

	std::cout << v1 * v2;
}

void TestVector()
{
	Vector v1(1.1, 2.2), v2;
	v2 = 3.0 + v1;

	CTest test;
	test.Show(v2);
}

int main()
{
	TestVector();
	TestTVector();

	return 0;
}