理解C++中的friend class

一、friend class的概念

C++中的friend關鍵字用於在類定義中聲明其他類或函數為友元,這樣它們就可以訪問類的私有成員。而friend class則用於聲明一整個類為友元。

當一個類被聲明為另一個類的友元時,它可以訪問該類的私有成員,但並不具備該類的成員函數或方法。而當一個類被聲明為另一個類的friend class時,它可以訪問該類的私有成員和成員函數或方法。

二、friend class的使用場景

friend class的使用場景多種多樣,下面介紹其中兩種典型的情境。

1.友元類與封裝的關係:

class Box
{
private:
    int length;
    int width;
    int height;

public:
    Box(int l = 0, int w = 0, int h = 0) 
    {
       length = l;
       width = w;
       height = h;
    }

    friend class BoxVolume; // 聲明BoxVolume類為Box的友元類
};

class BoxVolume
{
public:
    int getVolume(Box &box) {
        return box.length * box.width * box.height;
    }
};

在上面的示例中,我們聲明BoxVolume類為Box類的友元類,這樣BoxVolume類就可以訪問Box類的私有成員length、width和height,並利用它們計算出Box的體積。

2.友元類與繼承的關係:

class Fruit
{
protected: // 注意這裡使用protected而不是private
    int weight;

public:
    Fruit(int w) : weight(w) {}

    void showWeight() {
        std::cout << "Fruit's weight is: " << weight << std::endl;
    }

    friend class Apple; // 聲明Apple類為Fruit的友元類
};

class Apple : public Fruit
{
public:
    Apple(int w) : Fruit(w) {}

    void showWeight() {
        std::cout << "Apple's weight is: " << weight << std::endl;
    }

    void showFruitWeight(Fruit &fruit) {
        std::cout << "Fruit's weight is: " << fruit.weight << std::endl;
    }
};

在上面的示例中,我們聲明Apple類為Fruit類的友元類,這樣Apple類就可以訪問Fruit類的受保護成員weight,並將其作為Apple類自己的成員使用。

三、friend class的優缺點

friend class的優點在於它可以加強類與類之間的關係,提供更為靈活的訪問許可權控制。在某些場景下,如上面兩個示例所示,friend class可以極大地簡化類的實現過程,提高程序的執行效率。

然而,friend class也存在缺點。首先,它破壞了面向對象的封裝性,讓友元類得以在類內直接訪問另一個類的私有成員和方法,導致程序難以維護和拓展。其次,使用friend關鍵字增加了代碼複雜度,需要更多的注釋和說明。

四、總結

friend class是C++面向對象編程中一個非常有用的概念,可以提高程序的執行效率和靈活性,但也需要注意封裝性及代碼複雜度。在使用friend class時,需要對其使用的場景和影響進行合理的權衡和把握。

原創文章,作者:AQZO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/145640.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AQZO的頭像AQZO
上一篇 2024-10-27 23:51
下一篇 2024-10-27 23:51

相關推薦

  • Idea新建文件夾沒有java class的解決方法

    如果你在Idea中新建了一個文件夾,卻沒有Java Class,應該如何解決呢?下面從多個方面來進行解答。 一、檢查Idea設置 首先,我們應該檢查Idea的設置是否正確。打開Id…

    編程 2025-04-29
  • Python Class括弧中的參數用法介紹

    本文將對Python中類的括弧中的參數進行詳細解析,以幫助初學者熟悉和掌握類的創建以及參數設置。 一、Class的基本定義 在Python中,通過使用關鍵字class來定義類。類包…

    編程 2025-04-29
  • Class對象-解析從入門到精通

    一、Class對象 Java語言中,每一個類都有一個對應的Class對象。一個類被載入到JVM中之後,系統會為其生成唯一的Class對象。該對象包含了類的完整結構信息,如類的構造方…

    編程 2025-04-23
  • 全面了解C++ enum class

    一、enum class的簡介 1、C++中常用的枚舉類型是enum,但是enum的作用域是全局的,所以容易產生命名衝突的情況;而C++11中新增了enum class,可以將其作…

    編程 2025-04-23
  • 深入淺出public final class

    在Java語言中,public final class是一個常見的關鍵字組合,用於定義一個不可被繼承的類。本文將從多個方面詳細闡述public final class的使用,幫助讀…

    編程 2025-04-23
  • CSS多個class共用寫法

    一、定義多個class 在CSS中,可以為同一元素定義多個class,以實現不同樣式的復用。 <div class=”box red”></div> .bo…

    編程 2025-04-18
  • s-class的全能力解析

    一、什麼是s-class? s-class是一種Mercedes-Benz的高端轎車型號,它被設計成既可以用作豪華家庭用車,又可以用作優秀的商務車。 二、s-class的外觀特點 …

    編程 2025-04-12
  • 深入了解class標籤

    一、class標籤的作用 class標籤可以用來為HTML元素附加一個或多個class名稱,這些名稱通常被用來為多個元素定義一個樣式或多個樣式規則,並且可以通過多個class名稱指…

    編程 2025-04-12
  • python class和def的區別

    Python是一種面向對象的編程語言,其中類(class)和函數(def)是其中的重要組成部分。儘管類和函數在形式上有點相似,但它們在實際應用中有很大的不同。在本文中,我們將深入探…

    編程 2025-02-01
  • 深入理解Vue-Class-Component框架

    Vue.js是一個優秀的漸進式JavaScript框架,提供了獨特的template syntax以及豐富的生態系統。當我們在使用Vue.js時,我們可以結合其他工具庫來提高我們的…

    編程 2025-01-20

發表回復

登錄後才能評論