C++友元:friend
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); }
合集:
C++基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)