C++實例代碼詳解友元函數

友元函數 可以直接操作類的私有數據。

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++友元函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: