網(wǎng)站首頁 編程語言 正文
一、問題背景
對類的封裝是C++三大特性中的一個重要特性,封裝好的數(shù)據(jù)在類的外部是訪問不到的但是一旦出了問題,想要操作被封裝的數(shù)據(jù)怎么辦呢?由此友元函數(shù)友元類誕生了。在類中用friend
關鍵字聲明的函數(shù)或類,可以對類體中的任何權限成員屬性進行操作
有好處就有壞處友元函數(shù)、友元類嚴重破壞類的封裝性,不到迫不得已不要使用。
二、友元函數(shù)
聲明部分: friend 返回類型 函數(shù)名 (參數(shù)列表);
定義部分:返回類型 函數(shù)名 (參數(shù)列表){
? ? ?? ?函數(shù)體,在這個函數(shù)體中可以對相應對象的成員變量用運算符進行操作
? ? };
?友元函數(shù)就是一個全局函數(shù),成為了某類的朋友,可以隨意修改他的私有屬性。
具體使用方法如下:
#includeusing namespace std; class test_Y { private: ?? ?int a; ?? ?int b; public: ?? ?test_Y(int a=0,int b=0) { ?? ??? ?this->a = a; ?? ??? ?this->b = b; ?? ?} ?? ?int getA() { ?? ??? ?return a; ?? ?} ?? ?int getB() { ?? ??? ?return b; ?? ?} ?? ?void print() { ?? ??? ?cout << "a:" << a << " " << "b:" << b << endl; ?? ?} ?? ?void tran2(); ?? ?friend void tran1(test_Y& a); ?? ?void tran3(test_Y &a) { ?? ??? ?a.a = 0; ?? ??? ?a.b = 0; ?? ?} }; void tran1(test_Y& a) {//傳進去的是要改變的對象; ?? ?a.a = 100;//類的友元函數(shù)對變量的操作方法; ?? ?a.b = 100; } void test_Y::tran2() { ?? ?this->a = 200;//類的成員函數(shù)對變量的操作方法; ?? ?this->b = 200;//類中的私有成員變量只能在類體內(nèi)訪問不可以在類體外進行訪問 }//在類體外的成員函數(shù)中也不行;在類體內(nèi)就可以通過成員符對成員變量進行操作; int main() { ?? ?test_Y a1(1, 2),a2(3,4); ?? ?a1.tran2(); ?? ?a1.print(); ?? ?tran1(a2); ?? ?a2.print(); ?? ?a2.tran3(a2); ?? ?a2.print(); ?? ?return 0; }
友元函數(shù)在進行流運算符重載的時候非常實用。
三、友元類
聲明部分:friend 類名;
語法部分:在友元類中對另一個類中的成員屬性進行操作;
友元類會破壞類的封裝性要慎用;
具體使用方法如下:【將B類設置為A類的友元類】
#includeusing namespace std; class A { private: ?? ?int a; ?? ?int b; public: ?? ?A(int a = 0, int b = 0) { ?? ??? ?this->a = a; ?? ??? ?this->b = b; ?? ?} ?? ?void setAB(int a = 0, int b = 0) { ?? ??? ?this->a = a; ?? ??? ?this->b = b; ?? ?} ?? ?void print() { ?? ??? ?cout << a<<" "<< b << endl; ?? ?}//************************重點保護區(qū)******************************** ?? ?friend class B;//如果去掉就不可以訪問;類的嵌套也可以完成相互的初始化 };//但是不可以在另一個類中直接對類的私有屬性進行訪問;(去掉friend關鍵字顯而易見會報錯); class B {//************************保護重點,人人有責**************************** private: ?? ?int a; ?? ?int b; public: ?? ?B(int a=0,int b=0) { ?? ??? ?this->a = a; ?? ??? ?this->b = b; ?? ?} ?? ?void BuseA(A &a) {//B使用A類對象的屬性 ?? ??? ?this->a = a.a;//將類A對象的成員變量賦值給B類對象的成員變量; ?? ??? ?this->b = a.b; ?? ?} ?? ?void BsetA(A &a) {//B對象的屬性初始化A類對象的屬性 ?? ??? ?a.a = this->a; ?? ??? ?a.b = this->b; ?? ?} ?? ?void print() { ?? ??? ?cout << a << " " << b << endl; ?? ?} }; int main() { ?? ?B b1(1, 2); ?? ?A a1(3, 4); ?? ?b1.BsetA(a1);//B設置A; ?? ?a1.print(); ?? ?a1.setAB(100, 200);//對A的對象a1重新賦值;用于測試下面是否能夠改變B; ?? ?b1.BuseA(a1);//B的對象在A對象的基礎之上初始化; ?? ?b1.print(); }
友元類,在不到迫不得已的時候,不要使用。友元函數(shù)在進行
原文鏈接:https://blog.csdn.net/apple_51931783/article/details/122818632
相關推薦
- 2022-10-01 sql語法中的concat()函數(shù)詳解_MsSql
- 2022-06-01 AutoMapper實體映射基本用法_實用技巧
- 2023-10-09 使用Double Toke登錄的優(yōu)點
- 2022-11-23 .NET?SkiaSharp?生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)_實用技巧
- 2022-12-09 Python曲線擬合多項式深入詳解_python
- 2023-01-05 Pandas使用Merge與Join和Concat分別進行合并數(shù)據(jù)效率對比分析_python
- 2022-07-20 C語言深入探究直接插入排序與希爾排序使用案例講解_C 語言
- 2022-06-23 詳解windows?server?2012的DHCP保留地址導出導入、DHCP故障轉(zhuǎn)移配置、DNS條
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支