friend.cpp,RUN
//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;
}