網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
友元
友元 friend 機(jī)制允許一個(gè)類授權(quán)其他的函數(shù)訪問(wèn)它的非公有成員.
友元聲明以關(guān)鍵字 friend 開(kāi)頭 ,它只能出現(xiàn)在類的聲明中, 它們不受其在類體中的 public private 和
protected 區(qū)的影響.
友元分為外部函數(shù)友元, 成員函數(shù)友元,類友元。
特點(diǎn)
不具有對(duì)稱性:A 是 B 的友元, 并不意味著 B 是A的友元
不具有傳遞性:A是B的友元, B是C的友元, 但A不是C的友元。
不具有繼承性: Base 類型繼承 Object類型, 如果Object 類型是A的友元,但Base類型不是A友元。
外部函數(shù)友元
示例
需要在類中進(jìn)行對(duì)其進(jìn)行聲明,則可以訪問(wèn)類的所有成員
class Int
{
int value;
public:
Int(int x = 0):value(x)
{
cout<<"Create Int: "<<this<<endl;
}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
friend void Print(const Int &it); // 注冊(cè)為類的友元函數(shù)
};
void Print(const Int &it)
{
cout<<it.value<<endl;
}
int main()
{
Int a(10);
Print(a);
return 0;
}
成員函數(shù)友元
將一個(gè)成員函數(shù)聲明成友元的時(shí),必須要指明該成員函數(shù)屬于哪個(gè)類:
class Object; // 類的聲明
class Int
{
friend void Object::Print(const Int &it); // 注冊(cè)為成員函數(shù)友元
private:
int value;
public:
Int(int x = 0):value(x){ cout<<"Create Int: "<<this<<endl;}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
};
class Object
{
public:
void Print(const Int &it)
{
cout<<it.value<<endl;
}
};
int main()
{
Int a(10);
Object obj;
obj.Print(a);
return 0;
}
總結(jié)
1.友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問(wèn)對(duì)象的成員,必須用對(duì)象名加運(yùn)算符“.”加對(duì)象成員名。但友元函數(shù)可以訪問(wèn)類中的所有成員,一般函數(shù)只能訪問(wèn)類中的公有成員。
2.友元函數(shù)不受類中的訪問(wèn)權(quán)限關(guān)鍵字限制,可以把它放在類的公有、私有、保護(hù)部分,但結(jié)果一樣。
3.某類的友元函數(shù)的作用域并非該類作用域。如果該友元函數(shù)是另一類的成員函數(shù),則其作用域?yàn)榱硪活惖淖饔糜颍駝t與一般函數(shù)相同。
類友元
整個(gè)類可以是另一個(gè)類的友元。友元類的每個(gè)成員函數(shù)都是另一個(gè)類的友元函數(shù),都可訪問(wèn)另一個(gè)
類中的所以成員,共有,保護(hù)或私有數(shù)據(jù)成員
class Object; // 類的聲明
class Int
{
friend class Object; // 注冊(cè)為類友元
private:
int value;
public:
Int(int x = 0):value(x){ cout<<"Create Int: "<<this<<endl;}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
};
class Object
{
public:
void Print(const Int &it)
{
cout<<it.value<<endl;
}
};
int main()
{
Int a(10);
Object obj;
obj.Print(a);
return 0;
}
原文鏈接:https://blog.csdn.net/qq_42795061/article/details/125456796
相關(guān)推薦
- 2023-06-18 C#Process的OutputDataReceived事件不觸發(fā)問(wèn)題及解決_C#教程
- 2023-07-16 callBack: function(res){} 與 callBack: res =>{}
- 2023-05-06 React組件渲染后對(duì)DOM的操作方式_React
- 2022-06-13 C語(yǔ)言結(jié)構(gòu)體超詳細(xì)講解_C 語(yǔ)言
- 2022-08-14 Android實(shí)現(xiàn)顯示和隱藏密碼功能的示例代碼_Android
- 2022-12-23 Python異常信息的不同展現(xiàn)方法總結(jié)_python
- 2022-05-12 Kotlin zip函數(shù) 合并成鍵值對(duì)
- 2023-07-02 如何遠(yuǎn)程使用服務(wù)器上的Jupyter?notebook_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支