C++中友元函数与友元类详解
创作时间:
作者:
@小白创作中心
C++中友元函数与友元类详解
引用
1
来源
1.
http://www.cdweb.net/article/pgigsh.html
在C++中,友元机制提供了一种特殊的访问控制方式,允许非成员函数或类访问另一个类的私有和保护成员。这种机制虽然打破了封装性,但在某些特定场景下非常有用,比如需要频繁访问私有成员的场合。本文将详细介绍友元函数与友元类的概念、使用方法及注意事项。
友元机制概述
总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数。也可以将类A指定为类B的友元,则类A是类B的友元类,类A的所有成员函数均是类B的友元函数,均可以访问类B的非公有成员。
友元函数
注意事项
- 友元函数不是类的成员函数,在函数体中访问对象的成员,必须用“对象名.对象成员"方式来访问, 友元函数可以访问类中的所有成员(公有,私有,保护),而一般的函数只能访问类的公有成员。
- 友元函数不受类中的访问权限关键字的限制,可以将它放在类的公有,私有,保护部分,结果均一样。
- 某类的友元函数的作用域并非该类作用域,如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。
- 友元函数破坏了面向对象设计的封装特性。所以应该尽量少用。
示例代码
友元函数可以在类中声明,声明时在函数前增加friend关键字,然后在类体外定义,也可以直接在类中声明定义。这两种方式均可。下面例子中采取的是类中声明,类体外定义的方式。
class Point
{
friend double Distance(const Point &p1, const Point &p2); //类体中声明
public:
Point(int x, int y):x_(x), y_(y)
{};
private:
int x_;
int y_;
};
//类体外定义友元函数
double Distance(const Point &p1, const Point &p2)
{
double dx = p1.x_ - p2.x_; //直接访问类的私有成员
double dy = p1.y_ - p2.y_;
return sqrt(dx*dx+dy*dy);
}
int main()
{
Point p1(3,4);
Point P2(6,8);
cout << Distance(p1,p2) << endl;
return 0;
}
友元类
如果某类B的成员函数会频繁地访问类A的数据成员,而类A的数据成员的private/protected限制造成了类B存取的麻烦,B只能通过A的Public的成员函数进行间接存取。这种情况下可以将类B作为类A的友元类,即类A向类B提供私有和保护成员的访问权限,让类B可以直接存取。
友元类中的所有成员函数均可以看作是另一类的友元函数。
友元类的声明: friend chass 类名;
示例代码
下面是友元类的例子:
class Television //电视类
{
friend class TeleController;//友元类声明
public:
Television(int volume, int chanel): volume_(volume), chanel_(chanel){}
private:
int volume_; //音量
int chanel_; //频道
};
class TeleController //遥控器类
{
public: //类中的每个成员函数都是电视类的友元函数,都可以访问电视类的私有数据成员
void VolumeUp(Television &tv)
{
tv.volume_ += 1; //音量加1
}
void VolumeDown(Television &tv)
{
tv.volume_ -= 1;
}
void ChanelUp(Television &tv)
{
tv.chanel_ += 1; //频道加1
}
void ChanelDown(Television &tv)
{
tv.chanel_ -= 1; //频道减1
}
};
int main()
{
Television tv(1,1);
TeleController tc;
tc.ChanelUp(tv);
return 0;
}
友元类需要注意以下几点:
- 友元关系是单向的;
- 友元关系不能被传递: A是B的友元,B是C的友元,则A是C的友元,这种传递不成立
- 友元关系不能继承: A是B的友元,A的派生类C也是B的友元,这是不成立的。
热门推荐
五谷杂粮米糊可以每天喝吗?专家建议来了
五谷杂粮米糊:营养与风险并存,食用需谨慎
逛浪漫之城,寻海岛风情,珠海旅游必去11大景点推荐
这个眼病比近视更可怕,如何迅速判断?
从MBTI人格类型到现实思考:多角度剖析小龙女形象
发票丢失怎么办?法律规定的补救措施与法律责任分析
黑胡椒和白胡椒一字之差,用途却完全不同,厨师:很多人不懂瞎用
同学之间的“嫉妒”,正在蚕食90%的青少年
外国人认识孙悟空吗?
423所教育部认可的民办本科大学名单公布,可以分为哪些类型?
NFS网络文件系统详解
表情包属于什么知识产权
黄精变“黄金”!温江这个科研团队以成果转化开辟新赛道
4匹空调适合多大面积?全方位解析选购要点
4匹空调适合多大面积
植物神经紊乱患者适宜的运动选择
STP协议中的BPDU详解:概念、报文格式与时间参数
高邮市十大旅游景点
贸易术语 | CIP的含义、与CIF的区别及使用注意事项
从三大骑士团之首到黑色星期五的传说,一文读懂圣殿骑士团的辉煌与灭亡
花季男孩的求助——你所不知道的缺铁性贫血
碱性磷酸酶正常值范围是什么
合同封面条纹背景图片的法律意义及其应用
科技新进展:炼铁-炼钢区段全过程深度节能新技术开发与应用
瑞士一工人跌入720℃铝液熔炉,忍痛将自己拉出后,竟奇迹生还
中国汉字的演变过程顺序:八个阶段从甲骨文到行书
整体性:文艺复兴研究的未来向度
便秘的宝宝应该选择什么奶粉比较合适?
从毛瑟步枪到AK-47,枪支如何实现“全自动”?
四岁孩子口腔溃疡怎么办