亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

簡要介紹C++編程中的友元函數和友元類

2020-01-26 14:51:56
字體:
來源:轉載
供稿:網友

一個類中可以有 public、protected、private 三種屬性的成員,通過對象可以訪問 public 成員,只有本類中的函數可以訪問本類的 private 成員?,F在,我們來補充介紹一個例外――友元(friend)。

fnend 的意思是朋友,或者說是好友,與好友的關系顯然要比一般人親密一些。有的家庭可能會這樣處理:客廳對所有來客開放,而臥室除了本家庭的成員可以進人以外,還允許好朋友進入。在C++中,這種關系以關鍵宇 friend 聲明,中文多譯為友元。友元可以訪問與其有好友關系的類中的私有成員,友元包括友元函數和友元類。如果您對友元這個名詞不習慣,可以按原文 friend 理解為朋友即可。
友元函數

在當前類以外定義的、不屬于當前類的函數也可以在類中聲明,但要在前面加 friend 關鍵字,這樣就構成了友元函數。友元函數可以是不屬于任何類的非成員函數,也可以是其他類的成員函數。

友元函數可以訪問當前類中的所有成員,包括 private 屬性的。

1) 將普通函數聲明為友元函數。

#include<iostream>using namespace std;class Student{private: char *name; int age; float score;public: Student(char*, int, float); friend void display(Student &); //將display聲明為友元函數};Student::Student(char *name, int age, float score){ this->name = name; this->age= age; this->score = score;}//普通成員函數void display(Student &stu){ cout<<stu.name<<"的年齡是 "<<stu.age<<",成績是 "<<stu.score<<endl;}int main(){ Student stu("小明", 16, 95.5f); display(stu); return 0;}

運行結果:

小明的年齡是 16,成績是 95.5

請注意 display 是一個在類外定義的且沒有使用 Student 作限定的函數,它是非成員函數,不屬于任何類,它的作用是輸出學生的信息。如果在 Student 類中未聲明 display 函數為 friend 函數,它是不能引用 Student 中的私有成員 name、age、score 的。大家可以親測一下,將上面程序中的第11行刪去,觀察編譯時的信息。

現在由于聲明了 display 是 Student 類的 friend 函數,所以 display 可以使用 Student 中的私有成員 name、age、score。但注意在使用這些成員變量時必須加上對象名,不能寫成:

cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<endl;


因為 display 不是 Student 類的成員函數,默認不能使用 Student 類的成員,必須指定要訪問的對象。

2) 將其他類的成員函數聲明為友元函數
friend 函數不僅可以是普通函數(非成員函數),還可以是另一個類中的成員函數。請看下面的例子:

#include<iostream>using namespace std;class Address; //對Address類的提前引用聲明 //聲明Student類class Student{private: char *name; int age; float score;public: Student(char*, int, float); void display(Address &);};//聲明Address類class Address{private: char *province; char *city; char *district;public: Address(char*, char*, char*); //將Student類中的成員函數display聲明為友元函數 friend void Student::display(Address &);};Address::Address(char *province, char *city, char *district){ this->province = province; this->city = city; this->district = district;}//聲明Student類成構造函數和成員函數Student::Student(char *name, int age, float score){ this->name = name; this->age= age; this->score = score;}void Student::display(Address &add){ cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<endl; cout<<"家庭住址:"<<add.province<<"省"<<add.city<<"市"<<add.district<<"區"<<endl;}int main(){ Student stu("小明", 16, 95.5f); Address add("陜西", "西安", "雁塔"); stu.display(add); return 0;}

運行結果:

小明的年齡是 16,成績是 95.5家庭住址:陜西省西安市雁塔區

在本例中定義了兩個類 Student 和 Address。程序第 26 行將 Student 類中的成員函數 display 聲明為友元函數,由此,display 就可以訪問 Address 類的私有成員變量了。

兩點注意:
① 程序第4行對Address類進行了提前聲明,是因為在Address類定義之前、在Student類中使用到了它,如果不提前聲明,編譯會報錯,提示"Address" has not been declared。類的提前聲明和函數的提前聲明是一個道理。

② 程序中將 Student 類的聲明和定義分開了,而將 Address 放在了中間,是因為 Student::display() 函數體中用到了 Address 類的成員,必須出現在 Address 類的類體之后(類體說明了有哪些成員)。

這里簡單介紹一下類的提前聲明。一般情況下,類必須在正式聲明之后才能使用;但是某些情況下(如上例所示),只要做好提前聲明,也可以先使用。

但是應當注意,類的提前聲明的使用范圍是有限的。只有在正式聲明一個類以后才能用它去創建對象。如果在上面程序第4行后面增加一行:

Address obj; //企圖定義一個對象


會在編譯時出錯。因為創建對象時是要為對象分配內存空間的,在正式聲明類之前,編譯系統無法確定應該為對象分配多大的空間。編譯器只有在“見到”類體后(其實是見到成員變量),才能確定應該為對象預留多大的空間。在對一個類作了提前引用聲明后,可以用該類的名字去定義指向該類型對象的指針變量或對象的引用變量(如在本例中,定義了Address類對象的引用變量)。這是因為指針變量和引用變量本身的大小是固定的,與它所指向的類對象的大小無關。

請注意程序是在定義 Student::display() 函數之前正式聲明 Address 類的。這是因為在 Student::display() 函數體中要用到 Address 類的成員變量 province、city、district,如果不正式聲明 Address 類,編譯器就無法識別這些成員變量。

③ 一個函數可以被多個類聲明為“朋友”,這樣就可以引用多個類中的私有成員。
友元類

不僅可以將一個函數聲明為一個類的“朋友”,而且可以將整個類(例如B類)聲明為另一個類(例如A類)的“朋友”。這時B類就是A類的友元類。

友元類B中的所有函數都是A類的友元函數,可以訪問A類中的所有成員。在A類的類體中用以下語句聲明B類為其友元類:

friend B;


聲明友元類的一般形式為:

friend 類名;

關于友元,有兩點需要說明:
友元的關系是單向的而不是雙向的。如果聲明了 B類是A類的友元類,不等于A類是B類的友元類,A類中的成員函數不能訪問B類中的私有數據。
友元的關系不能傳遞,如果B類是A類的友元類,C類是B類的友元類,不等于 C類是A類的友元類。

在實際開發中,除非確有必要,一般并不把整個類聲明為友元類,而只將確實有需要的成員函數聲明為友元函數,這樣更安全一些。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色青青草原桃花久久综合| 亚洲自拍欧美另类| 精品久久久久久久久国产字幕| 欧美日韩精品二区| 国产丝袜视频一区| 中文字幕国产精品久久| 成人情趣片在线观看免费| 亚洲一区美女视频在线观看免费| 精品国内自产拍在线观看| 国模精品视频一区二区三区| 国产精品91在线| 日本一区二区三区在线播放| 精品久久香蕉国产线看观看gif| 黄色成人在线免费| 日韩欧美在线免费观看| 亚洲性猛交xxxxwww| 韩国v欧美v日本v亚洲| 亚洲综合精品伊人久久| 久久久久久久久爱| 热99精品里视频精品| 亚洲国产91色在线| 亚洲国产古装精品网站| 日韩三级影视基地| 欧美另类极品videosbest最新版本| 欧美性jizz18性欧美| 国产欧美精品xxxx另类| 亚洲精品电影久久久| 日韩经典中文字幕在线观看| 精品视频久久久久久久| 日韩激情第一页| 国产精品一区二区三区毛片淫片| 亚洲免费影视第一页| 欧美中文字幕在线播放| 国产视频精品久久久| 欧美黄色片在线观看| 少妇激情综合网| 欧美国产日韩免费| 国产精品日韩在线播放| 久久99热精品这里久久精品| 日韩三级成人av网| 国产91精品视频在线观看| 最近2019中文字幕mv免费看| 91精品视频播放| 国产一区二区动漫| 狠狠躁18三区二区一区| 精品国偷自产在线视频99| 色狠狠av一区二区三区香蕉蜜桃| 国产99久久久欧美黑人| 欧美日韩激情视频8区| 国产成人在线播放| 日韩成人性视频| 免费av一区二区| 亚洲国产中文字幕久久网| 久久久久久有精品国产| 精品亚洲一区二区| 精品国内自产拍在线观看| 欧美日韩一区免费| 精品无码久久久久久国产| 亚洲偷熟乱区亚洲香蕉av| 992tv在线成人免费观看| 久久影院资源站| 日韩精品中文字| 欧美国产视频日韩| 国产精品男人爽免费视频1| 欧美又大又硬又粗bbbbb| 亚洲精品大尺度| 97碰碰碰免费色视频| 亚洲在线免费看| 欧美在线视频免费| 欧美一级免费视频| 色悠久久久久综合先锋影音下载| 中文字幕在线日韩| 日韩精品在线免费播放| 国产日韩欧美成人| 欧美精品videosex牲欧美| 庆余年2免费日韩剧观看大牛| 国产精品自拍视频| 久久久免费在线观看| 狠狠躁18三区二区一区| 97色在线视频| 国产精品一区二区久久精品| 亚洲精品av在线播放| 亚洲精品小视频| 国产成人91久久精品| 亚洲国产精品久久久久久| 青青久久av北条麻妃黑人| 久久精品国产久精国产一老狼| 成人免费在线视频网站| 欧美巨大黑人极品精男| 国产狼人综合免费视频| 久久夜色精品亚洲噜噜国产mv| 青草青草久热精品视频在线观看| 亚洲日韩欧美视频| 国产精品91久久| 国产一区二区精品丝袜| 国产日韩欧美黄色| 久久久久久久爱| 色婷婷av一区二区三区在线观看| 伊人伊成久久人综合网小说| 亚洲成色www8888| 亚洲国产小视频在线观看| 国产精品久久99久久| 97精品伊人久久久大香线蕉| 精品国产乱码久久久久久天美| 欧美视频国产精品| 久久久在线免费观看| 日韩中文字幕在线| 国内精品久久久| 欧美成人精品一区二区三区| 精品国产鲁一鲁一区二区张丽| 精品国内亚洲在观看18黄| 欧美在线一区二区视频| 这里只有精品在线观看| 国产日韩欧美在线视频观看| 欧美成人精品一区二区| 欧美成人一区在线| 久久香蕉频线观| 亚洲成人激情图| 欧美日韩精品在线视频| 国产精品爱啪在线线免费观看| 美乳少妇欧美精品| 国产一区二区色| 精品久久久久久中文字幕| 在线观看久久久久久| 538国产精品一区二区在线| 最近2019好看的中文字幕免费| 久久夜精品香蕉| 精品久久久久久中文字幕一区奶水| 亚洲精品资源在线| 欧美亚洲激情在线| 国产精品视频中文字幕91| 国产国语videosex另类| 欧美中文在线视频| 成人情趣片在线观看免费| 欧美另类69精品久久久久9999| 亚洲精品xxxx| 国产精品永久在线| 久久精品国产亚洲精品| 久久久精品电影| 欧美成年人视频网站| 国产日韩欧美91| 欧美日韩另类字幕中文| 久久中国妇女中文字幕| 日韩电影中文字幕一区| 国产精品久久久久999| 美日韩在线视频| 最新国产成人av网站网址麻豆| 伊人久久综合97精品| 国产精品都在这里| 中文字幕免费精品一区高清| 亚洲第一精品自拍| 日韩精品免费一线在线观看| 国产成人高清激情视频在线观看| 日本国产欧美一区二区三区| 97精品国产91久久久久久| 日韩一二三在线视频播| 久久综合久久美利坚合众国| 亚洲黄色有码视频| 日韩av网站在线| 国产精品久久久久久久久久尿| 欧美日韩国产91| 欧美国产精品人人做人人爱| 欧美日韩亚洲激情| 亚洲欧洲在线视频|