在C++中關于友元函數的進一步理解
這里重新將類的成員函數的定義看一下:
百科上的認識:
類的成員函數的原型要寫在類體中,原型說明了函數的參數表和返回值類型。而函數的定義一般在類外面,也可以直接在類內部定義。前者與普通函數不同的是,實現(xiàn)成員函數時要指明類的名稱,具體形式為:
- 返回值類型 類名 :函數成員名(參數表){函數體};
- 而后者一般為一些短小的函數(5行以內),也就是內聯(lián)函數。
這里在百科上對友元函數的解釋:
友元函數是指某些雖然不是類成員卻能夠訪問類的所有成員的函數。類授予它的友元特別的訪問權。通常同一個開發(fā)者會出于技術和非技術的原因,控制類的友元和成員函數(否則當你想更新你的類時,還要征得其它部分的擁有者的同意)。
1.為什么要使用友元函數
優(yōu)點:能夠提高效率,表達簡單、清晰。
也有缺點:破壞了程序的封裝性。有時候不到萬不得已的時候才使用。
代碼解釋:
#include <iostream>
#include <string>
using namespace std;
class ca {
string id;
void setId(string s) {
id = s;
}
protected:
string name;
void setName(string s) {
name = s;
}
public:
void print() {
cout << id << " " << name << " " << endl;
}
friend void fun(ca& a); //申明全局函數作友元,允許它訪問私有保護成員
};
class derive : public ca { }; //ca類的派生類
void fun(ca& a) { //作友元的函數要定義在那個類的后面
a.id = "987"; //這是ca類的私有成員
a.setName("xyz"); //這是ca類的保護成員
}
int main ( )
{
ca a;
//a.fun(...); //友元函數不是當前類的成員函數,所以這句編譯出錯
fun(a);
a.print();
derive d;
fun(d); //作參數時,類型轉換為ca類
d.print();
return 0;
}
運行結果:
987 xyz
987 xyz
在就是友元函數的位置:可以在類外或者類內
聲明方式:friend+普通函數聲明
實現(xiàn)方式:像普通函數那樣直接調用
還有一點的是:其實一些操作符的重載實現(xiàn)也是要在類外實現(xiàn)的,那么通常這樣的話,聲明為類的友元是必須滴。(這就像我學的那個坐標類,直接用操作符重載,聲明友元函數)
最后一個知識點:
友元函數和類的成員函數的區(qū)別:
1.成員函數有this指針,而友元函數沒有this指針。
2.友元函數是不能被繼承的,就像父親的朋友未必是兒子的朋友。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
C++實現(xiàn)完整功能的通訊錄管理系統(tǒng)詳解
來了來了,通訊錄管理系統(tǒng)踏著七彩祥云飛來了,結合前面的結構體知識和分文件編寫方法,我總結并碼了一個帶菜單的通訊錄管理系統(tǒng),在這篇文章中將會提到C的清空屏幕函數,嵌套結構體具體實現(xiàn),簡單且充實,跟著我的思路,可以很清晰的解決這個項目2022-05-05
C++實現(xiàn)LeetCode(209.最短子數組之和)
這篇文章主要介紹了C++實現(xiàn)LeetCode(209.最短子數組之和),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08

