C++中友元的詳解及其作用介紹

概述

類的友元函數 (friend) 是定義在類外部, 但是有權限訪問類的所有私有 (private) 成員和保護 (protected) 成員.

在這裡插入圖片描述

友元

我們先來復習一下公有成員和私有成員的概念:

  • 公有成員 (public) : 在類外可以訪問
  • 私有成員 (private): 隻有本類中的函數可以訪問

友元 (friend) 可以訪問與其有好友關系的類中的私有成員 (有限制的共享).

友元包括友元函數和友元類:

  • 友元函數: 如果在本類以外的其他地方定義的函數, 在類體重用 friend 進行聲明. 此函數就稱為本類的有元函數, 友元函數可以訪問這個類中的私有成員
  • 友元類: 類 A 將另一個類 B 聲明為其友元類, 友元類 B 中的所有函數都是 A 類的友元函數, 可以訪問 A 類中的所有成員

普通的友元函數

Time 類:

#ifndef PROJECT2_TIME_H
#define PROJECT2_TIME_H

class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();
    Time(int, int, int);
    friend void display(Time &);  // display是Time類的friend函數
};

#endif //PROJECT2_TIME_H

Time.cpp:

#include <iostream>
#include "Time.h"
using namespace std;

Time::Time() : hour(0), minute(0), second(0) {}

Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

void display(Time &t) {
	// display不是Time類的成員函數, 但是可以引用Time中的私有成員
    cout << t.hour << ":" << t.minute << ":" << t.second << endl;
}

main:

#include "Time.h"
#include <iostream>
using namespace std;

int main() {

    Time t1(8, 8, 8);
    display(t1);

    return 0;
}

友元成員函數

Time 類:

#ifndef PROJECT2_TIME_H
#define PROJECT2_TIME_H

class Date;  // 對Date類進行提前引用聲明
class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();
    Time(int, int, int);
    void display(Date &d);
};

#endif //PROJECT2_TIME_H

Date 類:

#ifndef PROJECT2_DATE_H
#define PROJECT2_DATE_H

#include "Time.h"

class Date {
private:
    int year, month, day;
public:
    Date(int, int, int);
    friend void Time::display(Date &d);
};

#endif //PROJECT2_DATE_H

Time.cpp:

#include <iostream>
#include "Time.h"
#include "Date.h"
using namespace std;

Time::Time() : hour(0), minute(0), second(0) {}

Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

void Time::display(Date &d) {
    cout << d.year << "年" << d.month << "月" << d.day << "日" <<endl;
    cout << hour << ":" << minute << ":" << second << endl;
}

main:

#include "Time.h"
#include "Date.h"
#include <iostream>
using namespace std;

int main() {

    Time t1(8, 8, 8);
    Date d1(2021, 5, 6);
    t1.display(d1);

    return 0;
}

輸出結果:

2021年5月6日
8:8:8

我們可以發現 display 不是 Date 類的成員函數, 但是可以引用 Date 中的私有成員.

友元類

Time 類:

#ifndef PROJECT2_TIME_H
#define PROJECT2_TIME_H

class Date;  // 對Date類進行提前引用聲明
class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();
    Time(int, int, int);
    void display(Date &d);
};

#endif //PROJECT2_TIME_H

Date 類:

#ifndef PROJECT2_DATE_H
#define PROJECT2_DATE_H

#include "Time.h"

class Date {
private:
    int year, month, day;
public:
    Date(int, int, int);
    friend class Time;  // 友元類
};

#endif //PROJECT2_DATE_H

總結

  • 如果在本類以外的地方定義瞭一個函數在類體中用 friend 對其進行聲明, 此函數就稱為本類的友元函數
  • 友元函數可以訪問這個類中的私有成員
  • 友元函數可以是不屬於任何類的非成員函數, 也可以是其他類的成員函數
  • 一個函數可以被多個類聲明為 friend, 這樣就可以引用多個類中的私有數據.

友元的性質:

  • 友元的關系是單向的而不是雙向的
  • 友元的關系不能傳遞

友元的優缺點:

  • 優點: 有助於數據共享, 提高程序效率
  • 缺點: 破壞瞭封裝原則, 不利於信息隱藏

我們在使用友元的時候, 應當時刻考慮友元的缺點. 如果能用公共成員函數解決就不必用友元.

在這裡插入圖片描述

到此這篇關於C++中友元的詳解及其作用介紹的文章就介紹到這瞭,更多相關C++友元內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: