關於C++中的友元函數的一些總結。本站提示廣大學習愛好者:(關於C++中的友元函數的一些總結)文章只能為提供參考,不一定能成為您想要的結果。以下是關於C++中的友元函數的一些總結正文
1.友元函數的簡略引見
1.1為何要應用友元函數
在完成類之間數據同享時,削減體系開支,進步效力。假如類A中的函數要拜訪類B中的成員(例如:智能指針類的完成),那末類A中該函數如果類B的友元函數。詳細來講:為了使其他類的成員函數直接拜訪該類的公有變量。即:許可裡面的類或函數去拜訪類的公有變量和掩護變量,從而使兩個類同享統一函數。
現實上詳細年夜概有上面兩種情形須要應用友元函數:(1)運算符重載的某些場所須要應用友元。(2)兩個類要同享數據的時刻。
1.2應用友元函數的優缺陷
1.2.1長處:可以或許進步效力,表達簡略、清楚。
1.2.2缺陷:友元函數破環了封裝機制,盡可能不應用成員函數,除非不得已的情形下才應用友元函數。
2.友元函數的應用
2.1友元函數的參數:
由於友元函數沒有this指針,則參數要有三種情形:
2.1.1 要拜訪非static成員時,須要對象做參數;
2.1.2 要拜訪static成員或全局變量時,則不須要對象做參數;
2.1.3 假如做參數的對象是全局對象,則不須要對象做參數;
2.2友元函數的地位
由於友元函數是類外的函數,所以它的聲明可以放在類的公有段或私有段且沒有差別。
2.3友元函數的挪用
可以直接挪用友元函數,不須要經由過程對象或指針
2.4友元函數的分類:
依據這個函數的起源分歧,可以分為三種辦法:
2.4.1通俗函數友元函數
2.4.1.1 目標:使通俗函數可以或許拜訪類的友元
2.4.1.2 語法:
聲明: friend + 通俗函數聲明
完成地位:可以在類外或類中
完成代碼:與通俗函數雷同
挪用:相似通俗函數,直接挪用
2.4.1.3代碼:
class INTEGER
{
friend void Print(const INTEGER& obj);//聲明友元函數
};
void Print(const INTEGER& obj)
{
//函數體
}
void main()
{
INTEGER obj;
Print(obj);//直接挪用
}
2.4.2類Y的一切成員函數都為類X友元函數—友元類
2.4.2.1目標:應用單個聲明使Y類的一切函數成為類X的友元,它供給一品種之間協作的一種方法,使類Y的對象可以具有類X和類Y的功效。
2.4.2.2語法:
聲明地位:私有公有都可,常寫為公有(把類算作一個變量)
聲明: friend + 類名(不是對象哦)
2.4.2.3代碼:
class girl;
class boy
{
public:
void disp(girl &);
};
void boy::disp(girl &x) //函數disp()為類boy的成員函數,也是類girl的友元函數
{
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成員函數disp中,借助girl的對象,直接拜訪girl的公有變量
}
class girl
{
private:
char *name;
int age;
friend boy; //聲明類boy是類girl的友元
};
main函數就不寫了和通俗挪用時一樣的。
2.4.3類Y的一個成員函數為類X的友元函數
2.4.3.1目標:使類Y的一個成員函數成為類X的友元,詳細而言:在類Y的這個成員函數中,借助參數X,可以直接以X的公有變量
2.4.3.2語法:
聲明地位:聲明在私有中 (自己為函數)
聲明:friend + 成員函數的聲明
挪用:先界說Y的對象y---應用y挪用本身的成員函數---本身的成員函數中應用了友元機制
2.4.3.3代碼:
完成代碼和2.4.2.3中的完成及其類似只是設置友元的時刻變成friend void boy::disp(girl &);本身處理喽……
小結:其實一些操作符的重載完成也是要在類外完成的,那末平日如許的話,聲明為類的友元是必需滴。
4.友元函數和類的成員函數的差別
4.1 成員函數有this指針,而友元函數沒有this指針。
4.2 友元函數是不克不及被繼續的,就像父親的同伙未必是兒子的同伙。