網站首頁 編程語言 正文
友元
友元 friend 機制允許一個類授權其他的函數訪問它的非公有成員.
友元聲明以關鍵字 friend 開頭 ,它只能出現在類的聲明中, 它們不受其在類體中的 public private 和
protected 區的影響.
友元分為外部函數友元, 成員函數友元,類友元。
特點
不具有對稱性:A 是 B 的友元, 并不意味著 B 是A的友元
不具有傳遞性:A是B的友元, B是C的友元, 但A不是C的友元。
不具有繼承性: Base 類型繼承 Object類型, 如果Object 類型是A的友元,但Base類型不是A友元。
外部函數友元
示例
需要在類中進行對其進行聲明,則可以訪問類的所有成員
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); // 注冊為類的友元函數
};
void Print(const Int &it)
{
cout<<it.value<<endl;
}
int main()
{
Int a(10);
Print(a);
return 0;
}
成員函數友元
將一個成員函數聲明成友元的時,必須要指明該成員函數屬于哪個類:
class Object; // 類的聲明
class Int
{
friend void Object::Print(const Int &it); // 注冊為成員函數友元
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;
}
總結
1.友元函數不是類的成員函數,在函數體中訪問對象的成員,必須用對象名加運算符“.”加對象成員名。但友元函數可以訪問類中的所有成員,一般函數只能訪問類中的公有成員。
2.友元函數不受類中的訪問權限關鍵字限制,可以把它放在類的公有、私有、保護部分,但結果一樣。
3.某類的友元函數的作用域并非該類作用域。如果該友元函數是另一類的成員函數,則其作用域為另一類的作用域,否則與一般函數相同。
類友元
整個類可以是另一個類的友元。友元類的每個成員函數都是另一個類的友元函數,都可訪問另一個
類中的所以成員,共有,保護或私有數據成員
class Object; // 類的聲明
class Int
{
friend class Object; // 注冊為類友元
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
相關推薦
- 2022-11-26 Mongodb?如何將時間戳轉換為年月日日期_MongoDB
- 2023-02-25 Redisson如何解決redis分布式鎖過期時間到了業務沒執行完問題_Redis
- 2022-09-17 python?pandas處理excel表格數據的常用方法總結_python
- 2022-07-03 canvas文字居中;canvas畫布文字右對齊;canvas畫布文字左對齊;canvas文字自動換
- 2023-05-11 Oracle怎么刪除數據,Oracle數據刪除的三種方式_oracle
- 2022-07-25 C++全面精通類與對象_C 語言
- 2022-04-06 關于Redis數據庫三種持久化方案介紹_Redis
- 2022-12-30 python算法與數據結構朋友圈與水杯實驗題分析實例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支