日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

C++中的友元函數(shù)與友元類詳情_C 語言

作者:酷爾。 ? 更新時間: 2022-04-28 編程語言

一、問題背景

對類的封裝是C++三大特性中的一個重要特性,封裝好的數(shù)據(jù)在類的外部是訪問不到的但是一旦出了問題,想要操作被封裝的數(shù)據(jù)怎么辦呢?由此友元函數(shù)友元類誕生了。在類中用friend關鍵字聲明的函數(shù)或類,可以對類體中的任何權限成員屬性進行操作
有好處就有壞處友元函數(shù)、友元類嚴重破壞類的封裝性,不到迫不得已不要使用。

二、友元函數(shù)

聲明部分: friend 返回類型 函數(shù)名 (參數(shù)列表);

定義部分:返回類型 函數(shù)名 (參數(shù)列表){
? ? ?? ?函數(shù)體,在這個函數(shù)體中可以對相應對象的成員變量用運算符進行操作
? ? };

?友元函數(shù)就是一個全局函數(shù),成為了某類的朋友,可以隨意修改他的私有屬性。

具體使用方法如下:

#include
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) {//傳進去的是要改變的對象;
?? ?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類的友元類】

#include
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;
?? ?}//************************重點保護區(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

欄目分類
最近更新