首页 > 代码库 > C++学习笔记--友元
C++学习笔记--友元
C++控制对类对象私有部分的访问,在外部无法直接访问类的私有或保护成员。通常,公有类方法提供唯一的访问途径。有时这种限制太严格,不适合特定的编程问题。所以C++提供了友元这种形式,通过让函数或类成为类A的友元,可以赋予该函数或类与类A的成员函数具有相同的访问权限。
友元有3种:
(1)友元函数
(2)友元类
(3)友元成员函数
1、友元函数
将其原型放在类声明中,并加上friend关键字
如:
class Time{public: //友元函数 friend Time operator* (double n, const Time & t); //重载<<操作符 friend std::ostream & operator<< (std::ostream & os, const Time & t);private: int m_hours; int m_minutes;};
注意:
(1)operator*() 是在类声明中声明的,但它不是类成员函数,所以在定义函数时,不能使用Time::限定符。
(2)operator*()不是成员函数,但与成员函数的访问权限相同。
综述,类的友元函数是非成员函数,其访问权限与成员函数相同。
2、友元类
可以将类作为友元,友元类的所有方法都可以访问原始类的私有成员和保护成员。
如下 friend class Remote; 声明Remote为Tv类的友元类:
#ifndef TV_H_#define TV_H_//电视类class Tv{public: friend class Remote; //声明Remote类为Tv类的友元,Remote类的所有方法可以访问Tv的私有和保护成员 enum{off,on}; enum{Minval,MaxVal = 20}; Tv(int s = off,int mc = 100); ~Tv(void); void on_off(){state = (state == on ? off: on);}; bool is_on()const{return state == on;}; bool vol_up(); bool vol_down(); void channel_up(); void channel_down(); void show_settings()const;private: int state; int volume; int maxchannel; int channel;};//遥控器类class Remote{public: bool vol_up(Tv & tv){return tv.vol_up();}; bool vol_down(Tv & tv){return tv.vol_down();}; void on_off(Tv & tv){tv.on_off();}; void channel_up(Tv & tv){tv.channel_up();}; void channel_down(Tv & tv){tv.channel_down();}; void set_channel(Tv & tv, int ch){tv.channel = ch;};//友元可以访问原始类的私有成员};#endif
友元声明可以位于公有、私有或保护部分,其所在位置无关紧要。
3、友元成员函数
在Remote类中,只有set_channel(Tv & tv, int ch)方法直接访问Tv类的私有成员,所以可以选择只让这个方法成为类的友元,而不必让Remote整个类成为友元。不过这么做必须小心排列各种声明和定义的顺序。
让Remote::set_channel()成为Tv类的友元非方法是,在Tv类中将其声明为友元:
class Tv{ friend void Remote::set_channel(Tv & tv, int ch); };
C++学习笔记--友元
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。