首頁 > 軟體

C++中的友元函數與友元類詳情

2022-02-24 19:00:13

一、問題背景

對類的封裝是C++三大特性中的一個重要特性,封裝好的資料在類的外部是存取不到的但是一旦出了問題,想要操作被封裝的資料怎麼辦呢?由此友元函數友元類誕生了。在類中用friend關鍵字宣告的函數或類,可以對類體中的任何許可權成員屬性進行操作
有好處就有壞處友元函數、友元類嚴重破壞類的封裝性,不到迫不得已不要使用。

二、友元函數

宣告部分: friend 返回型別 函數名 (參數列);

定義部分:返回型別 函數名 (參數列){
        函數體,在這個函數體中可以對相應物件的成員變數用運運算元進行操作
    };

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

具體使用方法如下:

#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) {//傳進去的是要改變的物件;
    a.a = 100;//類的友元函數對變數的操作方法;
    a.b = 100;
}
void test_Y::tran2() {
    this->a = 200;//類的成員函數對變數的操作方法;
    this->b = 200;//類中的私有成員變數只能在類體記憶體取不可以在類體外進行存取
}//在類體外的成員函數中也不行;在類體內就可以通過成員符對成員變數進行操作;
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;
}

友元函數在進行流運運算元過載的時候非常實用。

三、友元類

宣告部分:friend 類名;

語法部分:在友元類中對另一個類中的成員屬性進行操作;
友元類會破壞類的封裝性要慎用;

具體使用方法如下:【將B類設定為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;
    }//************************重點保護區********************************
    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();
}

友元類,在不到迫不得已的時候,不要使用。友元函數在進行

到此這篇關於C++中的友元函數與友元類詳情的文章就介紹到這了,更多相關C++友元函數和友元類內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com