網站首頁 編程語言 正文
為什么使用成員函數和友元函數
這個問題至關重要,直接影響著后面的理解:
程序數據: 數據是程序的信息,會受到程序函數的影響。封裝是面向對象編程中的把數據和操作數據的函數綁定在一起的一個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。
數據封裝引申出了另一個重要的 OOP 概念,即 數據隱藏 。數據封裝 是一種把數據和操作數據的函數捆綁在一起的機制, 數據抽象 是一種僅向用戶暴露接口而把具體的實現細節隱藏起來的機制。C++ 通過創建類來支持封裝和數據隱藏(public、protected、private)。我們已經知道,類包含私有成員(private)、保護成員(protected)和公有成員(public)成員。默認情況下,在類中定義的所有項目都是私有的。
由于C++的封裝和隱藏特性,只有類定義的成員函數可以訪問類定義的私有數據。
成員函數是數據封裝和數據隱藏的機制。
友元是C++提供的一種破壞數據封裝和數據隱藏的機制。
成員函數的使用
首先先看代碼
class Stock{ //class declaration private: std:: string company; long shares; double share_val; double total_val; void set_tot(){ total_val=shares* share_val;} public: void acquire(const std:: string & co, long n, double pr); void buy(long num, double price); void se11(long num, double price); void update(double price); void show(); };//note semicolon at the end
注意這里面的private可以不寫,如果不寫的話默認是私有的。
其中,company、shares等都是Stock類的私有數據成員。如果試圖使用非成員函數訪問這些數據成員編譯器禁止這樣做。如果試圖破解該機制,友元是另一種選擇。
實現類成員函數
(1)定義成員函數時,使用作用域解析運算符(::)來標識函數所屬的類;
void Stock::update(double price)
(2)類方法可以訪問類的private組件。
友元
C++是從結構化的C語言發展而來的,需要照顧結構化設計程序員的習慣,所以在對私有成員可訪問范圍的問題上不可限制太死。
C++設計者認為,如果有的程序員真的非常怕麻煩,就是想在類的成員函數外部直接訪問對象的私有成員,那還是做一點妥協以滿足他們的愿望為好,這也算是眼前利益和長遠利益的折中。因此,C++就有了友元(friend)的概念。打個比方,這相當于是說:朋友是值得信任的,所以可以對他們公開一些自己的隱私。
友元提供了一種普通函數或者類成員函數訪問另一個類中的私有或保護成員的機制。也就是說有兩種形式的友元:
(1)友元函數:普通函數對一個訪問某個類中的私有或保護成員。
(2)友元類:類A中的成員函數訪問類B中的私有或保護成員。
(3)友元成員函數
友元函數
創建友元函數的第一步是將其原型放在類聲明中,并在原型聲明前加上關鍵字friend:
friend Time operator*(double m,constTime&t);
注意該聲明可以在類外也可以在類中
這樣即使operator不是成員函數 ,但它與成員函數的訪問權限相同,可以訪問類中的私有變量。
友元類
類Y的所有成員函數都為類X友元函數
class girl; class girl{ private: char *name; int age; friend boy; //聲明類boy是類girl的友元 }; class boy{ public: void disp(girl &); }; void boy::disp(girl &x) //函數disp()為類boy的成員函數,也是類girl的友元函數 { //借助友元,在boy的成員函數disp中,借助girl的對象,直接訪問girl的私有變量 cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl; }
成員函數作友元
類Y的一個成員函數為類X的友元函數
目的:使類Y的一個成員函數成為類X的友元,具體而言:在類Y的這個成員函數中,借助參數X,可以直接使用X的私有變量
語法:聲明在公有中 (本身為函數)
聲明:friend + 成員函數的聲明
調用:先定義Y的對象y—使用y調用自己的成員函數—自己的成員函數中使用了友元機制
class Stock{ //class declaration private: std:: string company; long shares; double share_val; double total_val; void set_tot(){ total_val=shares* share_val;} public: void acquire(const std:: string & co, long n, double pr); void buy(long num, double price); void se11(long num, double price); void update(double price); void show(); }; class Market{ friend void Stock::acquire(const std:: string & co, long n, double pr); //Stock類下的acquire可以作為該成員函數的友元函數,可以訪問該類的私有變量 int price; int fiture; public: void stuff(); };
如代碼所示,Stock類下的acquire函數作為Market的友元函數可以訪問market類的私有變量。
友元函數和類的成員函數的區別
友元函數和類的成員函數的區別成員函數有this指針,而友元函數沒有this指針。友元函數是不能被繼承的,就像父親的朋友未必是兒子的朋友。
總結
原文鏈接:https://blog.csdn.net/weixin_44282063/article/details/122693219
相關推薦
- 2022-06-08 ASP.NET?Core中MVC模式實現路由一_實用技巧
- 2022-11-16 Kotlin條件控制語句匯總講解_Android
- 2022-02-27 記錄npm 在windows下cmd中報錯以及idea下terminal安裝依賴時同樣報錯
- 2022-08-04 Go?slice切片使用示例詳解_Golang
- 2022-07-12 Springboot Druid 啟動報錯:Failed to configure a DataSo
- 2022-11-04 Android實現秒表功能_Android
- 2022-03-04 Tue Dec 01 00:00:00 GMT+08:00 1998 轉成自定義字符串
- 2023-04-08 React中的useEffect?useLayoutEffect到底怎么用_React
- 最近更新
-
- 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同步修改后的遠程分支