微信登錄界面相城seo網(wǎng)站優(yōu)化軟件
??????????????????????創(chuàng)做不易,麻煩點(diǎn)個(gè)關(guān)注????????????????????????
??????????????????文末有驚喜!獻(xiàn)舞一支!????????????????????
目錄
9.12 C++之友元函數(shù)
9.12.1 友元函數(shù)的聲明friend
9.12.2 普通全局函數(shù)作為類的友元函數(shù)
9.12.3 類的某個(gè)成員函數(shù)作為另外一個(gè)類的友元函數(shù)
9.12.4 整個(gè)類作為另外一個(gè)類的友元
點(diǎn)贊👍? + 收藏👐 + 關(guān)注👌
9.12 C++之友元函數(shù)
問(wèn)題:什么是友元函數(shù)?
????????在 C++ 中,友元函數(shù)是指在一個(gè)類的外部定義的、被該類聲明為友元的非成員函數(shù)。友元函數(shù)可以訪問(wèn)該類的所有成員(包括私有成員),并且可以在不通過(guò)類對(duì)象進(jìn)行訪問(wèn)的情況下改變成員的值。
? ? ? ? 類的擁有不同權(quán)限訪問(wèn)函數(shù)的一個(gè)主要特點(diǎn),即類的私有成員無(wú)法在類的外部(作用域之外)訪問(wèn)。但是,我們上一小節(jié)文章末尾留下了一個(gè)疑惑,在有時(shí)候需要在類的外部訪問(wèn)類的私有成員怎么辦?
????????解決方法是使用友元函數(shù),友元函數(shù)是一種特權(quán)函數(shù),C++允許這個(gè)特權(quán)函數(shù)訪問(wèn)私有成員。這一點(diǎn)從現(xiàn)實(shí)生活中也可以很好的理解。比如你的錢是你個(gè)人私有的,你家里人拿你的錢你是可以允許的,但是一個(gè)陌生人來(lái)拿你的錢,你就不能直接給他了。這時(shí)候你家人出來(lái)一個(gè)說(shuō)這是他的律師來(lái),是他的朋友,拿了一個(gè)東西證明了這個(gè)關(guān)系(friend == 合法合同、或者律師證,或者你的電話,或者你本人,用來(lái)證明你們朋友關(guān)系的紐帶),這樣就可以把你個(gè)人的錢給他了。我們可以把一個(gè)全局函數(shù)、某個(gè)類中的成員函數(shù)、甚至整個(gè)類聲明為友元。
? ? ?(👮👮👮這里提醒大家,不要輕易給陌生人轉(zhuǎn)賬、發(fā)紅包、匯款等,任何!所有!一切!讓你先轉(zhuǎn)賬才可以得到什么的理由!!!都是詐騙!!!并且不是通過(guò)購(gòu)物平臺(tái)或者官方的平臺(tái)的,私人的那種,而且交易方式?jīng)]有實(shí)名等!都是騙子!警惕詐騙,轉(zhuǎn)賬之前一定要確認(rèn)對(duì)方是否是你認(rèn)識(shí)的人,或者是你的家人等等。警防網(wǎng)絡(luò)詐騙,讓騙子無(wú)處可騙。防詐騙從每個(gè)人做起👮👮👮)
? ? ? ? 特別的:友元函數(shù)會(huì)破壞類的封裝性😭,因?yàn)樗接袛?shù)據(jù)可以被外部訪問(wèn)到
9.12.1 友元函數(shù)的聲明friend
????????友元函數(shù)使用friend關(guān)鍵字聲明一個(gè)函數(shù)為友元函數(shù)。
? ? ? ? friend關(guān)鍵字只使用于聲明處,一個(gè)函數(shù)或者是類對(duì)象作為另外一個(gè)類的友元,例如A類作為B類的友元,那么A類可以直接訪問(wèn)B類中的私有數(shù)據(jù)。
? ? ? ? 友元比較著重運(yùn)用在運(yùn)算符重載上。
9.12.2 普通全局函數(shù)作為類的友元函數(shù)
這里我們使用了一個(gè)案例舉例:是在千鋒教育C++嵌入式基礎(chǔ)班講解(后續(xù)案例用qf縮寫代替)的一個(gè)案例:例如你的家,有客廳,有你的臥室,那么你的客廳是Public的,所有來(lái)的客人都可以進(jìn)去,但是你的臥室是私有的,也就是說(shuō)只有你能進(jìn)去,但是呢,你也可以允許你的好閨蜜、好基友進(jìn)去參觀你的臥室(基于正常情況,防止杠精)。
1.當(dāng)不是友元的時(shí)候,訪問(wèn)私有成員會(huì)報(bào)錯(cuò)的
當(dāng)使用相同名字的時(shí)候,聲明為友元函數(shù)的時(shí)候,公共函數(shù)visitingfun()就沒(méi)有報(bào)錯(cuò)。?
完整案例+結(jié)果
代碼:
#include <iostream>
#include <string>
using namespace std;class Room
{friend void visitingfun(Room &room);
private:string bedRoom;//臥室public:
public:string setingRoom;//客廳pubTic:
public:Room(string bedRoom, string setingRoom){this->bedRoom = bedRoom;this->setingRoom = setingRoom;}
};
//普通全局函數(shù)
void visitingfun(Room &room){cout<<"訪問(wèn)了"<<room.setingRoom<<endl;cout<<"訪問(wèn)了"<<room.bedRoom<<endl;
}
void test01(){Room room("私人豪華大床房臥室","公共188大平層客廳");visitingfun(room);
}
int main()
{test01();return 0;
}
9.12.3 類的某個(gè)成員函數(shù)作為另外一個(gè)類的友元函數(shù)
這個(gè)案例中,goodfriens類中的vistinng_02成員函數(shù)作為Room1類的友元函數(shù)。此時(shí)就是不同類的成員,進(jìn)行一個(gè)私有成員變量的訪問(wèn)。
拓展:
?上面的案例中,成員函數(shù)聲明和定義順序比較關(guān)鍵,總所周知,程序是向下編譯的,順序執(zhí)行。
那看下面這個(gè)圖片中:成員函數(shù)放到類對(duì)象里,此時(shí)報(bào)錯(cuò)原因,即使你提前聲明了Room1,但是由于初始化階段,還沒(méi)有生成Room1的成員,此時(shí)編譯器是不知道Room1里面有什么成員的。所以此時(shí)報(bào)錯(cuò)了。
另外,goodfriends的聲明也應(yīng)該在Room1聲明之前(這里僅僅針對(duì)9.12.3主題來(lái)說(shuō),因?yàn)槟阋氖浅蓡T函數(shù))?,編譯器提前聲明只是知道了一個(gè)名字,編譯順序始終是從上往下執(zhí)行的。
所以,你要把類中要成為友元函數(shù)的成員函數(shù),定義實(shí)現(xiàn)放在外面,放在所有類的聲明的后面就行了。
9.12.4 整個(gè)類作為另外一個(gè)類的友元
????????就是這個(gè)類的所有成員函數(shù)都可以訪問(wèn)另一個(gè)類的私有數(shù)據(jù)。
并且,聲明的順序可成員函數(shù)的基本一致。
?代碼:
class Room1;//向前聲明方式,這樣只能說(shuō)明類的名稱
class goodfrieds
{
public:void visiting_01(Room1 &room);void visiting_02(Room1 &room);};
class Room1{//friend void goodfrieds::visiting_02(Room1 &room);friend class goodfrieds;
private:string bedRoom;//臥室public:
public:string setingRoom;//客廳pubTic:
public:Room1(string bedRoom, string setingRoom){this->bedRoom = bedRoom;this->setingRoom = setingRoom;}
};
void goodfrieds::visiting_01(Room1 &room){cout<<"訪問(wèn)了01"<<room.setingRoom<<endl;cout<<"訪問(wèn)了01"<<room.bedRoom<<endl;
}
void goodfrieds::visiting_02(Room1 &room){cout<<"訪問(wèn)了02"<<room.bedRoom<<endl;cout<<"訪問(wèn)了02"<<room.setingRoom<<endl;
}
void test03(){Room1 room("私人豪華大床房臥室","公共188大平層客廳");goodfrieds ob;ob.visiting_01(room);ob.visiting_02(room);
}
int main()
{test03();return 0;
}
點(diǎn)贊👍? + 收藏👐 + 關(guān)注👌
??您的支持??是我最大的動(dòng)力??相互學(xué)習(xí)??共同進(jìn)步??一起搞錢??動(dòng)動(dòng)發(fā)財(cái)?shù)男∈??
? ????????????????????十星好評(píng),Erike的專用模板????????????????????
謝? ? ?謝? ? ?老? ? ?板!老? ? ?板? ? ?大? ? ?氣!