C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++友元函数

C++实例代码详解友元函数

作者:Bright-SKY

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数

友元函数 可以直接操作类的私有数据。

friend关键字在声明处修饰函数 那么该函数就是类的友元。

友元 不是类的一部分。

友元概述

c++允许 友元 访问 私有数据。

友元的语法:

friend关键字只出现在声明处 其他类、类成员函数、全局函数都可声明为友元 友元函数不是类的成员,不带this指针 友元函数可访问对象任意成员属性,包括私有属性。

普通全局函数作为类的友元

//房间类
class Room
{
    //将goodGayVisit作为类的友元函数
    //goodGayVisit 访问 类中所有数据 但是 它不是类的成员
    friend void goodGayVisit(Room &room);
private:
    string bedRoom;//卧室
public:
    string sittingRoom;//客厅
public:
    Room()
    {
        this->bedRoom = "卧室";
        this->sittingRoom="客厅";
    }
};
// 普通全局函数 作为 类的友元
//好基友 访问 我的房间
void goodGayVisit(Room &room)
{
    cout<<"好基友访问了你的"<<room.sittingRoom<<endl;
    cout<<"好基友访问了你的"<<room.bedRoom<<endl;//ok
}
void test01()
{
    Room myRoom;
    goodGayVisit(myRoom);
}

运行结果:

类的某个成员函数作为另一个类的友元

问题1:

问题2:

成员函数内 不能访问 Room的私有数据

最终代码:

#include <iostream>
using namespace std;
class Room;//Room向前声明
class GoodGay
{
public:
    void visit1(Room &room);//此处的Room 被上方 class Room
    void visit2(Room &room);
};
class Room
{
    //如果想方 visit2作为Room类的友元 那么Visit2就可以访问 Room的私有数据
    //一定要记得 加类作用域
    friend void GoodGay::visit2(Room &room);
private:
    string bedRoom;//卧室
public:
    string sittingRoom;//客厅
public:
    Room()
    {
        this->bedRoom = "卧室";
        this->sittingRoom="客厅";
    }
};
void GoodGay::visit1(Room &room)
{
    cout<<"好基友visit1访问了你的"<<room.sittingRoom<<endl;
    //cout<<"好基友visit1访问了你的"<<room.bedRoom<<endl;//不能访问 Room私有数据
}
void GoodGay::visit2(Room &room)
{
    cout<<"好基友visit2访问了你的"<<room.sittingRoom<<endl;
    cout<<"好基友visit2访问了你的"<<room.bedRoom<<endl;
}
int main(int argc, char *argv[])
{
    Room myRoom;
    GoodGay goodGay;
    goodGay.visit1(myRoom);//只能访问客厅
    goodGay.visit2(myRoom);//客厅 卧室 都可以访问
    return 0;
}

运行结果:

一个类整体作为另一个类的友元

一个类的所有成员函数 访问 另一个类的私有数据

#include <iostream>
using namespace std;
class Room;//Room向前声明
class GoodGay
{
public:
    void visit1(Room &room);//此处的Room 被上方 class Room
    void visit2(Room &room);
};
class Room
{
    //将GoodGay作为Room的友元
    //GoodGay 所有成员函数 都可以访问 Room私有数据
    friend class GoodGay;
private:
    string bedRoom;//卧室
public:
    string sittingRoom;//客厅
public:
    Room()
    {
        this->bedRoom = "卧室";
        this->sittingRoom="客厅";
    }
};
void GoodGay::visit1(Room &room)
{
    cout<<"好基友visit1访问了你的"<<room.sittingRoom<<endl;
    cout<<"好基友visit1访问了你的"<<room.bedRoom<<endl;
}
void GoodGay::visit2(Room &room)
{
    cout<<"好基友visit2访问了你的"<<room.sittingRoom<<endl;
    cout<<"好基友visit2访问了你的"<<room.bedRoom<<endl;
}
int main(int argc, char *argv[])
{
    Room myRoom;
    GoodGay goodGay;
    goodGay.visit1(myRoom);
    goodGay.visit2(myRoom);
    return 0;
}

运行结果:

友元的注意事项

1.友元关系不能被继承。

2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A 的朋友。

3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋 友

封装电视机 和遥控器的类

1、封装电视机的类

class TV
{
    enum{ On,Off }; //电视状态
    enum{ minVol,maxVol = 100 }; //音量从0到100
    enum{ minChannel = 1,maxChannel = 255 }; //频道从1到255
private:
    int mState; //电视状态,开机,还是关机
    int mVolume; //电视机音量
    int mChannel; //电视频道
public:
    TV()
    {
        this->mState = Off;//默认关机
        this->mVolume = minVol;
        this->mChannel = minChannel;
    }
    void onOrOff(void)
    {
        this->mState = (this->mState == On ? Off:On);
    }
    //加大音量
    void volumeUp(void)
    {
        if(this->mVolume >= maxVol)
            return;
        this->mVolume++;
    }
    //减小音量
    void volumeDown(void)
    {
        if(this->mVolume <= minVol)
            return;
        this->mVolume--;
    }
    //增加频道
    void channelUp(void)
    {
        if(this->mChannel >= maxChannel)
            return;
        this->mChannel++;
    }
    //减小频道
    void channelDown(void)
    {
        if(this->mChannel <= minChannel)
            return;
        this->mChannel--;
    }
    //显示电视机的状态
    void showTVState(void)
    {
        cout<<"电视机的状态为:"<< (this->mState==On ? "开机":"关机") <<endl;
        cout<<"电视机的音量:"<<this->mVolume<<endl;
        cout<<"电视机的频道:"<<this->mChannel<<endl;
    }
};
void test01()
{
    TV tv;
    tv.onOrOff();//开机
    tv.volumeUp();//调四次音量
    tv.volumeUp();
    tv.volumeUp();
    tv.volumeUp();
    tv.channelUp();//调三次频道
    tv.channelUp();
    tv.showTVState();
}

运行结果:

2、设置遥控器的类2-1

class TV
{
    friend class Remote;
    //默认为私有
    enum{ On,Off }; //电视状态
    enum{ minVol,maxVol = 100 }; //音量从0到100
    enum{ minChannel = 1,maxChannel = 255 }; //频道从1到255
private:
    int mState; //电视状态,开机,还是关机
    int mVolume; //电视机音量
    int mChannel; //电视频道
public:
    TV()
    {
        this->mState = Off;//默认关机
        this->mVolume = minVol;
        this->mChannel = minChannel;
    }
    void onOrOff(void)
    {
        this->mState = (this->mState == On ? Off:On);
    }
    //加大音量
    void volumeUp(void)
    {
        if(this->mVolume >= maxVol)
            return;
        this->mVolume++;
    }
    //减小音量
    void volumeDown(void)
    {
        if(this->mVolume <= minVol)
            return;
        this->mVolume--;
    }
    //增加频道
    void channelUp(void)
    {
        if(this->mChannel >= maxChannel)
            return;
        this->mChannel++;
    }
    //减小频道
    void channelDown(void)
    {
        if(this->mChannel <= minChannel)
            return;
        this->mChannel--;
    }
    //显示电视机的状态
    void showTVState(void)
    {
        cout<<"电视机的状态为:"<< (this->mState==On ? "开机":"关机") <<endl;
        cout<<"电视机的音量:"<<this->mVolume<<endl;
        cout<<"电视机的频道:"<<this->mChannel<<endl;
    }
};
//遥控器类
class Remote
{
private:
    TV *pTv;
public:
    Remote(TV *pTv)
    {
        this->pTv = pTv;
    }
    //音量的加减
    void volumeUp(void)
    {
        //调节的电视机的音量
        this->pTv->volumeUp();
    }
    void volumeDown(void)
    {
        this->pTv->volumeDown();
    }
    //频道的加减
    void channelUp(void)
    {
        this->pTv->channelUp();
    }
    void channelDown(void)
    {
        this->pTv->channelDown();
    }
    //电视开关
    void onOrOff(void)
    {
        this->pTv->onOrOff();
    }
    //遥控器设置频道设置
    void setChannel(int num)
    {
        //判断 频道 是否有效
        if(num >= TV::minChannel && num<= TV::maxChannel )
        {
            this->pTv->mChannel = num;
        }
    }
    void showTVState(void)
    {
        this->pTv->showTVState();
    }
};
void test02()
{
    TV tv;
    Remote remote(&tv);
    remote.onOrOff();
    remote.volumeUp();
    remote.volumeUp();
    remote.volumeUp();
    remote.volumeUp();
    remote.channelUp();
    remote.channelUp();
    remote.showTVState();
    remote.setChannel(75);
    remote.showTVState();
}

运行结果:

到此这篇关于C++实例代码详解友元函数的文章就介绍到这了,更多相关C++友元函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文