1.基本用法
友元的概念还是比较简单的,主要作用是,让声明的友元函数或者友元类,可以直接访问当前类的私有成员。
可以这样理解,友元声明代表了,向大家说明这个函数或类是我的朋友(friend),因此它可以随意使用我内部的私有成员。
基本形式:
friend+函数声明
friend+class+类名
class Point { friend double Distance(const Point& p1, const Point& p2); //友元函数 friend class Line; //友元类 private: int m_x; int m_y; };
2.友元函数
基本形式:
class Point { friend double Distance(const Point& p1, const Point& p2); private: int m_x; int m_y; }; double Distance(const Point& p1, const Point& p2) { double derta_x = p1.m_x - p2.m_x; double derta_y = p1.m_y - p2.m_y; return sqrt(derta_x * derta_x - derta_y * derta_y); }
声明之后,就可以在函数Distance中调用Point的私有成员。需要保证友元函数与当前类在同一命名空间下。
注意,以下示例为错误,不能这么用!!!:
1.友元函数声明不能跨命名空间
namespace space1 { class Point { friend double Distance(const Point& p1, const Point& p2); friend double space2::Distance(const Point& p1, const Point& p2); //无效 } namespace space2 { double Distance(const space1::Point& p1, const space1::Point& p2) { double derta_x = p1.m_x - p2.m_x; //错误,无法调用私有成员 double derta_y = p1.m_y - p2.m_y; //错误,无法调用私有成员 return sqrt(derta_x * derta_x - derta_y * derta_y); } }
2.友元函数声明不能针对类当中的函数(除非声明友元类)
class Point { friend double Line::Distance(); //无效 private: int m_x; int m_y; }; class Line { private: double Distance(); Point m_p1; Point m_p2; }; double Line::Distance() { double derta_x = m_p1.m_x - m_p2.m_x; //错误,无法调用私有成员 double derta_y = m_p1.m_y - m_p2.m_y; //错误,无法调用私有成员 return sqrt(derta_x * derta_x - derta_y * derta_y); }
3.友元类
基本形式:
class Point { friend class Line; private: int m_x; int m_y; }; class Line { private: double Distance(); Point m_p1; Point m_p2; }; double Line::Distance() { double derta_x = m_p1.m_x - m_p2.m_x; double derta_y = m_p1.m_y - m_p2.m_y; return sqrt(derta_x * derta_x - derta_y * derta_y); }
声明之后,就可以在类Line中调用Point的私有成员。需要保证友元类与当前类在同一命名空间下。和友元函数相同,不同命名空间,或者类中类的情况,友元声明无效。
注意,以下示例为错误,不能这么用!!!:
1.友元类声明不能跨命名空间
namespace space1 { class Point { friend class space2::Line; //无效 private: int m_x; int m_y; }; } namespace space2 { class Line { private: double Distance(); space1::Point m_p1; space1::Point m_p2; }; double Line::Distance() { double derta_x = m_p1.m_x - m_p2.m_x; //错误,无法调用私有成员 double derta_y = m_p1.m_y - m_p2.m_y; //错误,无法调用私有成员 return sqrt(derta_x * derta_x - derta_y * derta_y); } }
2.友元类声明不能针对类中类
class Point { friend class Plane::Line; //无效 private: int m_x; int m_y; }; class Plane { private: class Line { double Distance(); Point m_p1; Point m_p2; }; }; double Plane::Line::Distance() { double derta_x = m_p1.m_x - m_p2.m_x; //错误,无法调用私有成员 double derta_y = m_p1.m_y - m_p2.m_y; //错误,无法调用私有成员 return sqrt(derta_x * derta_x - derta_y * derta_y); }