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á)到最佳的效果。