亲宝软件园·资讯

展开

C++友元函数

Bright-SKY 人气:0

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

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();
}

运行结果:

加载全部内容

相关教程
猜你喜欢
用户评论