• 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); 
    };
    
  • 相关阅读:
    JS中原型对象中的constructor的作用?
    ES Module,commonjs和Typescript模块系统
    webpack中的hash、chunkhash和contenthash
    react-spring介绍(翻译)
    Typescript中的对象多可能类型推导的解决办法
    博客定制样式和脚本代码
    React和Vue对比
    CSS动画属性/重绘重排组合层/GPU加速 渲染优化相关及联系
    Object.create()探索
    await的错误处理问题,一个issue引发的ts社区的讨论
  • 原文地址:https://www.cnblogs.com/cmranger/p/4136332.html
Copyright © 2020-2023  润新知