一起学习交流~

c/c++细节知识点 11友元

c++面试准备 laomuji 4周前 (09-01) 76次浏览 已收录 0个评论

友元

在c++中 通常只有公有方法提供访问,但有些时候限制过于严格,所以出现了友元
友元分为3种
友元函数
友元类(权限过大)
友元成员函数(不常用,较麻烦)

友元函数

/*
友元函数
*/
class Class11_1{
private:
    int num;
    friend void func11_1_ShowNum(Class11_1& c);//友元函数
public:
    Class11_1(int num) {
        this->num = num;
    }
};
void func11_1_ShowNum(Class11_1& c) {
    //非类函数调用类的私有成员,友元函数
    cout << c.num << endl;
}
int main11_1() {
    Class11_1 c(123);
    func11_1_ShowNum(c);
    return 0;
}

友元类


/*
友元类
假设 有一个电视机类 一个遥控器类
遥控器显然要可以控制电视机 但 不能继承电视机
*/

class Class11_TV {
private:
    enum class State{
        on,off
    };
    State state; //开机或者关机状态
    int volume; // 声音
    int channel; // 当前频道
    int size;// 频道数量
    friend class Class11_Remote1;//友元类
public:
    Class11_TV() {
        state = State::off;
        volume = 80;
        channel = 0;
        size = 20;
    }
    void switchTV() {state == State::on ? state = State::off : state = State::on;}
    void nextChannel() {channel < size ? channel = channel + 1 : channel = 0;}
    void lastChannel() {channel > 0 ? channel = channel - 1 : channel = size;}
    void nextVolume() {if (volume < 100)volume = volume + 1;}
    void lastVolume() {if (volume > 0)volume = volume - 1;}
};

class Class11_Remote1 {
public:
    //友元类的所有函数都可以访问目标类的元素
    void setChannel(Class11_TV &tv,int channel) {
        tv.channel = channel;
    }
    void setVolume(Class11_TV& tv, int volume) {
        tv.volume = volume;
    }
};

友元成员函数

/*
友元成员函数
比如 仅允许remote的其中指定的一个函数控制tv
友元成员函数 使用起来很苛刻
必须使用前置声明、类成员函数的定义也必须放到类外部
而且 顺序必须是
class tv;
class remote{};
class tv{};
顺序不允许交换
所以友元成员函数用的不多
*/
class Class11_TV2;
class Class11_Remote2 {
public:
    void setChannel(Class11_TV2& tv, int channel);
    void setVolume(Class11_TV2& tv, int volume);
};
class Class11_TV2 {
    friend void Class11_Remote2::setChannel(Class11_TV2& tv, int channel);//友元成员函数
private:
    int channel;
    int volume;
};
void Class11_Remote2::setChannel(Class11_TV2& tv, int channel) {
    tv.channel = channel;
}
void Class11_Remote2::setVolume(Class11_TV2& tv, int volume) {
    //tv.volume = volume;//无法使用
}
喜欢 (0)
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论