国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

C++教程:C++友元函數(shù)講解

2020-05-23 14:25:42
字體:
供稿:網(wǎng)友
私有成員數(shù)據(jù)除了可能被別的類訪問之外,也可能被別的函數(shù)或別的類的部分成員函數(shù)訪問。為了保證類的封裝性,我們可以以函數(shù)作為單位,“對(duì)外開放”類的私有成員。與聲明友元類類似,如果我們想用函數(shù)訪問鏈表結(jié)點(diǎn)類的私有成員數(shù)據(jù),則那些函數(shù)必須得到鏈表結(jié)點(diǎn)類的認(rèn)可。聲明友元函數(shù)的語句格式為:
    friend 返回值類型函數(shù)名(參數(shù)表);
如果該函數(shù)是某個(gè)類的成員函數(shù),則語句格式為:
    friend 返回值類型類名::函數(shù)名(參數(shù)表);

需要注意的是,在聲明友元成員函數(shù)時(shí),可能會(huì)牽扯出一系列的類的聲明順序問題。當(dāng)類的結(jié)構(gòu)本身就比較復(fù)雜時(shí),友元的使用可能會(huì)使得這個(gè)問題愈加突出。
下面我們就用友元函數(shù)來輸出一個(gè)結(jié)點(diǎn)的信息:(程序16.2.2)
//node.h
class Node
{
   friend class Linklist; //在Node類中聲明友元類Linklist
   friend void ShowNode(Node &n);//聲明友元函數(shù)ShowNode
   public:
   Node();
   Node(Node &n);
   Node(int i,char c='0');
   Node(int i,char c,Node *p,Node *n);
   ~Node();
   static int allocation();
   private:
   int idata;
   char cdata;
   Node *prior;
   Node *next;
   static int count;
};
//node.cpp
//其余部分同程序16.2.1
void ShowNode(Node &n)
{
   cout <<n.idata <<'/t' <<n.cdata <<endl;//友元函數(shù)可以訪問私有成員數(shù)據(jù)
}
//linklist.h同程序16.2.1
//main.cpp
#include <iostream>
#include "Linklist.h"
using namespace std;
int main()
{
   int tempi;
   char tempc;
   cout <<"請(qǐng)輸入一個(gè)整數(shù)和一個(gè)字符:" <<endl;
   cin >>tempi >>tempc;
   Linklist a(tempi,tempc);
   a.Locate(tempi);
   a.Insert(1,'C');
   a.Insert(2,'B');
   cout <<"After Insert" <<endl;
   a.Show();
   Node b(4,'F');
   cout <<"An independent node created" <<endl;
   cout <<"Use friend function to show node" <<endl;
   ShowNode(b);//用友元函數(shù)輸出b結(jié)點(diǎn)的內(nèi)容
   return 0;
}

運(yùn)行結(jié)果:
請(qǐng)輸入一個(gè)整數(shù)和一個(gè)字符:
3 F
Node constructor is running...
Linklist constructor is running...
Node constructor is running...
Node constructor is running...
After Insert
3 F
2 B
1 C
Node constructor is running...
An independent node created
Use friend function to show node
4 G
Node destructor is running...
Linklist destructor is running...
Node destructor is running...
Node destructor is running...
Node destructor is running...

我們看到函數(shù)ShowNode成功地訪問了鏈表結(jié)點(diǎn)b的私有成員數(shù)據(jù)。所以當(dāng)一個(gè)函數(shù)要訪問一個(gè)或多個(gè)對(duì)象的私有成員時(shí),我們可以用友元來解決這個(gè)問題。

友元的利與弊

我們使用了友元之后,發(fā)現(xiàn)在設(shè)計(jì)程序的時(shí)候方便了很多。原先的那些私有成員都能輕松地被訪問了。于是我們不用去寫那些繁瑣的成員函數(shù),程序執(zhí)行的時(shí)候也減少了函數(shù)的調(diào)用次數(shù),提高了運(yùn)行效率。

一個(gè)“好朋友”帶來的是效率和方便,而一個(gè)“壞朋友”卻能帶來更多的麻煩。友元的存在,破壞了類的封裝性。一個(gè)類出現(xiàn)問題,就不僅僅是由這個(gè)類本身負(fù)責(zé)了,還可能和它眾多的友元有關(guān)。這無疑使得檢查調(diào)試的范圍突然擴(kuò)大了許多,難度也陡然增加。

所以,我們?cè)谑褂糜言臅r(shí)候,權(quán)衡使用友元的利弊,使程序達(dá)到最佳的效果。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桐庐县| 桦甸市| 三河市| 陆河县| 鄯善县| 房山区| 交口县| 兴文县| 合作市| 平顶山市| 措勤县| 成武县| 安仁县| 西乌珠穆沁旗| 安西县| 元谋县| 凉城县| 霍邱县| 平舆县| 方城县| 绵阳市| 青浦区| 崇明县| 西昌市| 长沙市| 莆田市| 津南区| 神农架林区| 广丰县| 肥城市| 礼泉县| 泸定县| 民丰县| 通山县| 仁怀市| 周口市| 长治市| 冕宁县| 漳平市| 开阳县| 雷波县|