C++實例代碼詳解友元函數(shù)
友元函數(shù) 可以直接操作類的私有數(shù)據(jù)。
friend關(guān)鍵字在聲明處修飾函數(shù) 那么該函數(shù)就是類的友元。
友元 不是類的一部分。
友元概述
c++允許 友元 訪問 私有數(shù)據(jù)。
友元的語法:
friend關(guān)鍵字只出現(xiàn)在聲明處 其他類、類成員函數(shù)、全局函數(shù)都可聲明為友元 友元函數(shù)不是類的成員,不帶this指針 友元函數(shù)可訪問對象任意成員屬性,包括私有屬性。
普通全局函數(shù)作為類的友元
//房間類 class Room { //將goodGayVisit作為類的友元函數(shù) //goodGayVisit 訪問 類中所有數(shù)據(jù) 但是 它不是類的成員 friend void goodGayVisit(Room &room); private: string bedRoom;//臥室 public: string sittingRoom;//客廳 public: Room() { this->bedRoom = "臥室"; this->sittingRoom="客廳"; } }; // 普通全局函數(shù) 作為 類的友元 //好基友 訪問 我的房間 void goodGayVisit(Room &room) { cout<<"好基友訪問了你的"<<room.sittingRoom<<endl; cout<<"好基友訪問了你的"<<room.bedRoom<<endl;//ok } void test01() { Room myRoom; goodGayVisit(myRoom); }
運行結(jié)果:
類的某個成員函數(shù)作為另一個類的友元
問題1:
問題2:
成員函數(shù)內(nèi) 不能訪問 Room的私有數(shù)據(jù)
最終代碼:
#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的私有數(shù)據(jù) //一定要記得 加類作用域 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私有數(shù)據(jù) } 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; }
運行結(jié)果:
一個類整體作為另一個類的友元
一個類的所有成員函數(shù) 訪問 另一個類的私有數(shù)據(jù)
#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 所有成員函數(shù) 都可以訪問 Room私有數(shù)據(jù) 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; }
運行結(jié)果:
友元的注意事項
1.友元關(guān)系不能被繼承。
2.友元關(guān)系是單向的,類A是類B的朋友,但類B不一定是類A 的朋友。
3.友元關(guān)系不具有傳遞性。類B是類A的朋友,類C是類B的朋友,但類C不一定是類A的朋 友
封裝電視機 和遙控器的類
1、封裝電視機的類
class TV { enum{ On,Off }; //電視狀態(tài) enum{ minVol,maxVol = 100 }; //音量從0到100 enum{ minChannel = 1,maxChannel = 255 }; //頻道從1到255 private: int mState; //電視狀態(tài),開機,還是關(guān)機 int mVolume; //電視機音量 int mChannel; //電視頻道 public: TV() { this->mState = Off;//默認關(guān)機 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--; } //顯示電視機的狀態(tài) void showTVState(void) { cout<<"電視機的狀態(tài)為:"<< (this->mState==On ? "開機":"關(guān)機") <<endl; cout<<"電視機的音量:"<<this->mVolume<<endl; cout<<"電視機的頻道:"<<this->mChannel<<endl; } }; void test01() { TV tv; tv.onOrOff();//開機 tv.volumeUp();//調(diào)四次音量 tv.volumeUp(); tv.volumeUp(); tv.volumeUp(); tv.channelUp();//調(diào)三次頻道 tv.channelUp(); tv.showTVState(); }
運行結(jié)果:
2、設置遙控器的類2-1
class TV { friend class Remote; //默認為私有 enum{ On,Off }; //電視狀態(tài) enum{ minVol,maxVol = 100 }; //音量從0到100 enum{ minChannel = 1,maxChannel = 255 }; //頻道從1到255 private: int mState; //電視狀態(tài),開機,還是關(guān)機 int mVolume; //電視機音量 int mChannel; //電視頻道 public: TV() { this->mState = Off;//默認關(guān)機 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--; } //顯示電視機的狀態(tài) void showTVState(void) { cout<<"電視機的狀態(tài)為:"<< (this->mState==On ? "開機":"關(guān)機") <<endl; cout<<"電視機的音量:"<<this->mVolume<<endl; cout<<"電視機的頻道:"<<this->mChannel<<endl; } }; //遙控器類 class Remote { private: TV *pTv; public: Remote(TV *pTv) { this->pTv = pTv; } //音量的加減 void volumeUp(void) { //調(diào)節(jié)的電視機的音量 this->pTv->volumeUp(); } void volumeDown(void) { this->pTv->volumeDown(); } //頻道的加減 void channelUp(void) { this->pTv->channelUp(); } void channelDown(void) { this->pTv->channelDown(); } //電視開關(guān) 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(); }
運行結(jié)果:
到此這篇關(guān)于C++實例代碼詳解友元函數(shù)的文章就介紹到這了,更多相關(guān)C++友元函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!