C++中的友元函數(shù)與友元類詳情
一、問(wèn)題背景
對(duì)類的封裝是C++三大特性中的一個(gè)重要特性,封裝好的數(shù)據(jù)在類的外部是訪問(wèn)不到的但是一旦出了問(wèn)題,想要操作被封裝的數(shù)據(jù)怎么辦呢?由此友元函數(shù)友元類誕生了。在類中用friend
關(guān)鍵字聲明的函數(shù)或類,可以對(duì)類體中的任何權(quán)限成員屬性進(jìn)行操作
有好處就有壞處友元函數(shù)、友元類嚴(yán)重破壞類的封裝性,不到迫不得已不要使用。
二、友元函數(shù)
聲明部分: friend 返回類型 函數(shù)名 (參數(shù)列表);
定義部分:返回類型 函數(shù)名 (參數(shù)列表){
函數(shù)體,在這個(gè)函數(shù)體中可以對(duì)相應(yīng)對(duì)象的成員變量用運(yùn)算符進(jìn)行操作
};
友元函數(shù)就是一個(gè)全局函數(shù),成為了某類的朋友,可以隨意修改他的私有屬性。
具體使用方法如下:
#include<iostream> using 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) {//傳進(jìn)去的是要改變的對(duì)象; ?? ?a.a = 100;//類的友元函數(shù)對(duì)變量的操作方法; ?? ?a.b = 100; } void test_Y::tran2() { ?? ?this->a = 200;//類的成員函數(shù)對(duì)變量的操作方法; ?? ?this->b = 200;//類中的私有成員變量只能在類體內(nèi)訪問(wèn)不可以在類體外進(jìn)行訪問(wèn) }//在類體外的成員函數(shù)中也不行;在類體內(nèi)就可以通過(guò)成員符對(duì)成員變量進(jìn)行操作; 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ù)在進(jìn)行流運(yùn)算符重載的時(shí)候非常實(shí)用。
三、友元類
聲明部分:friend 類名;
語(yǔ)法部分:在友元類中對(duì)另一個(gè)類中的成員屬性進(jìn)行操作;
友元類會(huì)破壞類的封裝性要慎用;
具體使用方法如下:【將B類設(shè)置為A類的友元類】
#include<iostream> using 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; ?? ?}//************************重點(diǎn)保護(hù)區(qū)******************************** ?? ?friend class B;//如果去掉就不可以訪問(wèn);類的嵌套也可以完成相互的初始化 };//但是不可以在另一個(gè)類中直接對(duì)類的私有屬性進(jìn)行訪問(wèn);(去掉friend關(guān)鍵字顯而易見會(huì)報(bào)錯(cuò)); class B {//************************保護(hù)重點(diǎn),人人有責(zé)**************************** 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類對(duì)象的屬性 ?? ??? ?this->a = a.a;//將類A對(duì)象的成員變量賦值給B類對(duì)象的成員變量; ?? ??? ?this->b = a.b; ?? ?} ?? ?void BsetA(A &a) {//B對(duì)象的屬性初始化A類對(duì)象的屬性 ?? ??? ?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設(shè)置A; ?? ?a1.print(); ?? ?a1.setAB(100, 200);//對(duì)A的對(duì)象a1重新賦值;用于測(cè)試下面是否能夠改變B; ?? ?b1.BuseA(a1);//B的對(duì)象在A對(duì)象的基礎(chǔ)之上初始化; ?? ?b1.print(); }
友元類,在不到迫不得已的時(shí)候,不要使用。友元函數(shù)在進(jìn)行
到此這篇關(guān)于C++中的友元函數(shù)與友元類詳情的文章就介紹到這了,更多相關(guān)C++友元函數(shù)和友元類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中的構(gòu)造函數(shù)與析造函數(shù)詳解
這篇文章主要介紹了C++中的構(gòu)造函數(shù)與析造函數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++標(biāo)準(zhǔn)庫(kù)中sstream與strstream的區(qū)別詳細(xì)解析
以下是對(duì)C++標(biāo)準(zhǔn)庫(kù)中sstream與strstream的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09C語(yǔ)言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09C# CLR 中學(xué)習(xí) C++關(guān)鍵詞extern使用詳解
這篇文章主要為大家介紹了C# CLR 中學(xué)習(xí) C++ 之extern使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09使用C++中的ADO對(duì)SQLite進(jìn)行增刪改查
本文將介紹如何使用C++的ADO (ActiveX Data Objects)對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-06-06C++面向?qū)ο髮?shí)現(xiàn)萬(wàn)年歷的示例代碼
本文將通過(guò)面向?qū)ο髮?shí)現(xiàn)一個(gè)簡(jiǎn)單的日歷(萬(wàn)年歷)效果,主要會(huì)有以下幾個(gè)模塊:模型、視圖、控制,感興趣的小伙伴可以動(dòng)手嘗試一下2022-06-06