C++模塊化之內部類

目錄

1.引言

2.內部類的訪問控制

3.優缺點分析

4.實際運用

4.1.實現復雜數據結構

4.2.封裝細節實現

4.3.事件處理和回調

4.4.模板元編程輔助類

4.5. 訪問控制和封裝

4.6. 代碼組織和模塊化

5.總結


1.引言

? ? ? ? 在C++中,內部類(Nested Class)是一種相對不太常用但卻非常強大的編程工具。就是在一個類內部定義另外一個類,注意此時這個內部類是一個獨立的類,它不屬于外部類,更不能通過外部類的對象去調用內部類。外部類對內部類沒有任何優越的訪問權限。

? ? ? ? 注意:內部類就是外部類的友元類。注意友元類的定義,內部類可以通過外部類的對象參數來訪問外部類中的所有成員,不管是public、protected、private。但是外部類不是內部類的友元。

下面是一個簡單的內部類的例子:

#include <iostream>  
using namespace std;  class Outer {  
public:  int outerValue;  class Inner {  public:  void display() {  // 直接訪問外部類的公有成員  cout << "Outer value: " << outerValue << endl;  }  };  Inner inner;  
};  int main() {  Outer outer;  outer.outerValue = 10;  outer.inner.display(); // 訪問內部類的成員函數  return 0;  
}

在這個例子中,Inner類是在Outer類的內部定義的。Inner類可以直接訪問Outer類的公有成員outerValue。在main函數中,我們首先創建了Outer類的對象outer,然后設置了它的outerValue成員的值,最后調用了內部類Inner的成員函數display來顯示outerValue的值。

2.內部類的訪問控制

內部類與外部類之間的訪問控制是C++中的一個重要特性。內部類可以訪問外部類的私有和保護成員,反之亦然。這使得內部類可以更方便地操作外部類的內部狀態。以下是一個例子:

class OuterClass {
private:int outerValue;public:OuterClass(int value) : outerValue(value) {}class InnerClass {public:void display(const OuterClass& outer) {std::cout << "Outer class value: " << outer.outerValue << std::endl;}};
};int main() {OuterClass outer(42);OuterClass::InnerClass inner;inner.display(outer);return 0;
}

在這個例子中,InnerClass通過傳遞一個OuterClass對象的引用來訪問其私有成員outerValue。這種設計使得內部類可以直接與外部類進行交互,而不需要暴露外部類的私有成員。

注意內部類可以直接訪問外部類中的static、枚舉成員,不需要外部類的對象/類名。

class A
{
public: class B{void foo(){cout << k <<endl;//OK//cout << h <<endl;// ERROR}};private: static int k;int h;
};
int A::k=3;

內部類可以現在外部類中聲明,然后在外部類外定義:

class A
{
public: class B;private: static int i;
};class A::B
{
public:void foo(){cout << i <<endl;}//!!!這里也不需要加A::i.
};int A::i=3;

3.優缺點分析

優點

????????封裝性增強:

????????內部類可以幫助將一個類的實現細節封裝起來,避免外部直接訪問這些細節。通過內部類,可以更方便地訪問外部類的私有成員,而無需將這些成員暴露給外部世界,從而增強了類的封裝性。

????????內部類可以聲明為private或protected,進一步限制其訪問范圍,實現更好的信息隱藏。

????????模塊化:

????????內部類使得相關的功能可以集中在一個地方,提高了代碼的可讀性和維護性。尤其是在實現復雜的數據結構(如樹、圖)時,內部類可以用來表示節點或邊,使得數據結構的實現更加清晰和緊湊。

????????作用域控制:

????????內部類的作用域被限制在外部類的范圍內,這有助于避免命名沖突和不必要的依賴。同時,這種設計也使得內部類的使用更加局部化,減少了全局作用域中的類數量。

????????訪問控制靈活性:

????????內部類可以訪問外部類的所有成員(包括私有成員),這為類之間的數據共享和交互提供了便利。同時,通過調整內部類的訪問修飾符(如public、protected、private),可以對內部類的訪問進行靈活控制。

????????實現隱藏:

????????在一些需要隱藏實現細節的場景中,內部類可以有效地將這些細節封裝起來。例如,在數據庫連接池的實現中,可以使用內部類來封裝連接的管理邏輯。

缺點

????????復雜性增加:

????????雖然內部類可以提高封裝性和模塊化,但它們也可能增加代碼的復雜性。當嵌套層次較多時,理解和維護代碼可能會變得更加困難。

????????可讀性問題:

????????對于不熟悉內部類設計模式的開發者來說,內部類可能會降低代碼的可讀性。因此,在使用內部類時,需要提供充分的注釋和文檔來解釋其設計目的和使用方式。

????????訪問限制:

????????盡管內部類可以訪問外部類的私有成員,但外部類不能直接訪問內部類的私有成員(除非通過內部類的對象)。這可能會在某些情況下限制設計的靈活性。

????????編譯器支持:

????????盡管大多數現代C++編譯器都支持內部類,但在一些特殊情況下,可能會遇到編譯器特有的問題或限制。因此,在跨平臺開發時需要注意編譯器之間的差異。

4.實際運用

內部類在實際編程中有著廣泛的應用,以下是幾個常見的場景:

4.1.實現復雜數據結構

在實現如樹、圖等復雜數據結構時,內部類可以用來表示節點或邊,從而使得數據結構的實現更加清晰和緊湊。例如,在實現二叉樹時,可以將節點定義為內部類:

class BinaryTree {  
private:  struct Node {  int value;  Node* left;  Node* right;  Node(int val) : value(val), left(nullptr), right(nullptr) {}  };  Node* root;  
public:  BinaryTree() : root(nullptr) {}  // 添加節點、刪除節點等函數  
};

4.2.封裝細節實現

在一些需要隱藏實現細節的場景中,內部類可以有效地將這些細節封裝起來。例如,在實現一個加密算法,在某種特殊的情況下,我想隱藏這個加密算法實現,那么就可以把這個加密算法封裝在類的內部,通過接口提供出來,代碼如下:

#include <iostream>
#include <string>//加密接口
class IDecrypt
{
public:virtual std::string  encryptDecrypt(const std::string& input, char key) = 0;
};//一種加密實現
class CBasicDecrypt : public IDecrypt
{
public:std::string encryptDecrypt(const std::string& input, char key) override {std::string output = input;for (size_t i = 0; i < input.length(); ++i) {output[i] = input[i] ^ key;}return output;}
};class CMyBusiness
{...protected://我的加密實現class CMyDecrypt : public IDecrypt{public:std::string encryptDecrypt(const std::string& input, char key) override {std::string output = input;for (size_t i = 0; i < input.length(); ++i) {output[i] = input[i] | key;}return output;}       };public://通過接口給外界使用,隱藏它的實現IDecrypt* getDecrypt() {return &m_myDecrypt;}private:CMyDecrypt  m_myDecrypt;
};

4.3.事件處理和回調

在GUI編程或需要事件處理機制的應用中,內部類常用于實現事件處理和回調函數。例如,在一個按鈕點擊事件處理中,可以使用內部類來封裝事件處理邏輯:

class Button {  
public:  class ClickListener {  public:  virtual void onClick() = 0;  };  
private:  ClickListener* listener;  
public:  void setClickListener(ClickListener* listener) {  this->listener = listener;  }  void click() {  if (listener) {  listener->onClick();  }  }  
};

4.4.模板元編程輔助類

????????在進行模板元編程時,內部類可以用作輔助類,以提供額外的類型信息和操作。這些內部類有助于實現更復雜的模板邏輯和類型轉換。

4.5. 訪問控制和封裝

????????內部類提供了一種靈活的訪問控制機制。通過將內部類聲明為private或protected,可以限制外部代碼對內部類的訪問,從而增強類的封裝性。同時,內部類可以訪問外部類的私有成員,這為實現緊密耦合的類關系提供了便利。

4.6. 代碼組織和模塊化

????????內部類有助于將相關的功能組織在一起,提高代碼的可讀性和可維護性。通過將輔助類或工具類定義為內部類,可以減少全局命名空間的污染,并使代碼結構更加清晰。

5.總結

????????綜上所述,C++內部類在實際應用中具有廣泛的應用場景,包括實現復雜數據結構、封裝細節實現、事件處理和回調、模板元編程輔助類以及代碼組織和模塊化等方面。通過合理使用內部類,可以提高代碼的封裝性、可讀性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40245.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣爆刷第159天之TOP100五連刷61-65(翻轉單詞、對稱二叉樹、遍歷求和)

力扣爆刷第159天之TOP100五連刷61-65&#xff08;翻轉單詞、對稱二叉樹、遍歷求和&#xff09; 文章目錄 力扣爆刷第159天之TOP100五連刷61-65&#xff08;翻轉單詞、對稱二叉樹、遍歷求和&#xff09;一、151. 反轉字符串中的單詞二、129. 求根節點到葉節點數字之和三、104. 二…

簡單解讀倫敦銀CFD(XAG)走勢圖

從本質上說&#xff0c;倫敦銀是一種差價合約&#xff08;CFD&#xff09;交易&#xff0c;在同平臺所提供的MT4中&#xff0c;它的代碼也許并不一樣&#xff0c;有的平臺會顯示為XAG&#xff0c;有的平臺會顯示為LLS或Silver&#xff0c;但它們指的其實是同一個品種&#xff0…

Python學習筆記29:進階篇(十八)常見標準庫使用之質量控制中的數據清洗

前言 本文是根據python官方教程中標準庫模塊的介紹&#xff0c;自己查詢資料并整理&#xff0c;編寫代碼示例做出的學習筆記。 根據模塊知識&#xff0c;一次講解單個或者多個模塊的內容。 教程鏈接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 質量控制…

基于單片機的防酒駕控制系統設計

摘 要&#xff1a; 酒后駕車的危害十分巨大&#xff0c;因此&#xff0c;筆者介紹了一種基于單片機的防酒駕控制系統。系統由酒精傳感器 MQ-3測量汽車駕駛員體內的酒精含量濃度&#xff0c;通過 A/D 轉換器轉換成數字信號傳給單片機&#xff0c;經過單片機處理后顯示酒精濃度&a…

c++11新特性-6-using

文章目錄 using1.定義別名 using 1.定義別名 1.1 定義類型別名 using t int; 1.2 定義函數指針 int test(double,string){}//返回值類型 int &#xff0c;參數類型&#xff1a;double string using func int(*) (double,string);int main() {func f test;f(10.5,“hello…

算法訓練營day69

查并集&#xff1a;107. 尋找存在的路徑 (kamacoder.com) #include<iostream> #include<vector>using namespace std;vector<int> father(101, 0);void init() {for(int i 1;i < 101;i) {father[i] i;} }int find(int v) {if(v father[v]) return v;e…

老年生活照護實訓室:為養老服務業輸送專業人才

本文探討了老年生活照護實訓室在養老服務業專業人才培養中的關鍵作用。通過詳細闡述實訓室的功能、教學實踐、對學生能力的培養以及面臨的挑戰和解決方案&#xff0c;強調了其在提升人才素質、滿足行業需求方面的重要性&#xff0c;旨在為養老服務業的可持續發展提供有力的人才…

electron教程(二)控制應用程序的事件生命周期

1.will-finish-launching 當應用程序完成基礎的啟動的時候被觸發&#xff0c;在 Windows 和 Linux 中, will-finish-launching 事件與 ready 事件是相同的; 在 macOS 中&#xff0c;這個事件相當于 NSApplication 中的 applicationWillFinishLaunching 提示。 app.on(will-fi…

Butterfly主題文章標題改成轉動小風車

效果 標題級別不同小風車顏色不同&#xff0c;鼠標移入會有轉動變慢及變色效果。 新建css 建議在/source下創建諸如img/css/js等文件夾&#xff0c;存放文章或網站用的素材&#xff0c;分門別類后續也方便維護。 Hexo打包的時候&#xff0c;會自動把/source下的文件&#…

深度神經網絡語言識別

「AI秘籍」系列課程&#xff1a; 人工智能應用數學基礎人工智能Python基礎人工智能基礎核心知識人工智能BI核心知識人工智能CV核心知識 使用 DNN 和字符 n-gram 對一段文本的語言進行分類&#xff08;附 Python 代碼&#xff09; 資料來源&#xff0c;flaticon&#xff1a;htt…

AI繪畫如何變現賺取副業收入?保姆級AI繪畫SD和MJ副業實操教程建議收藏!

hi~大家好&#xff0c;我是向陽。 今天給大家分享一下我是如何通過AI繪畫賺到一點小錢的&#xff01; 副業做個人IP&#xff0c;某書&#xff0c;專注Midjourney &#xff0c;深入 AI頭像制作&#xff0c;小某書做了500頭像&#xff0c;變現了差不多一萬元&#xff0c;每日短…

[qt][C++]object.h(448): error C2238: 意外的標記位于“;”之前

問題場景&#xff1a;此問題多發生在qt調用python.h&#xff0c;比如matplotlib-cpp等需要python引用的C庫 #include <Python.h>報錯 \python\python37-32\include\object.h(448): error C2059: 語法錯誤:“;” \python\python37-32\include\object.h(448): error C223…

鴻蒙開發:Universal Keystore Kit(密鑰管理服務)【生成密鑰(C/C++)】

生成密鑰(C/C) 以生成ECC密鑰為例&#xff0c;生成隨機密鑰。具體的場景介紹及支持的算法規格。 注意&#xff1a; 密鑰別名中禁止包含個人數據等敏感信息。 開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復…

【C語言】五子棋(c語言實現)

這里寫目錄標題 最終效果菜單打印函數棋盤的初始化和打印人人對戰落子判空函數悔棋函數判勝負函數人人對戰 人機對戰一是將直接調用rand生成隨機值&#xff0c;這就不可控二是根據棋子贏面來判斷哪里落子最好 如果選擇退出程序直接exit就行主函數調用邏輯源代碼 最終效果 五子棋…

‘艾’公益——微笑行動「廣安站」為艾祝福,讓笑起舞

艾多美“微笑行動”廣安站拉開帷幕 此次愛心幫助7名唇腭裂患兒 重新綻放微笑 艾多美“微笑行動”廣安站拉開帷幕 此次愛心幫助7名唇腭裂患兒 重新綻放微笑 不讓笑容留有缺憾 每個孩子都有微笑的權利 艾多美向唇腭裂兒童伸出援手 綻放笑容&#xff0c;擁抱全新的未來 2…

進程、程序、應用程序之間的關系

文章目錄 進程和程序進程和應用程序總結參考資料 進程和程序 程序&#xff1a;程序是存放在硬盤中的可執行文件&#xff0c;主要包括代碼指令和數據。程序本身是一個靜態的文件&#xff0c;只有在被操作系統加載到內存中并執行時才會變成進程。 進程&#xff1a;進程是程序在…

衛星軌道平面簡單認識

目錄 一、軌道平面 1.1 軌道根數 1.2 應用考慮 二、分類 2.1 根據運行高度 2.2 根據運行軌跡偏心率 2.3 根據傾角大小 三、衛星星座中的軌道平面 四、設計軌道平面的考慮因素 一、軌道平面 1.1 軌道根數 軌道平面是定義衛星或其他天體繞行另一天體運動的平面。這個平…

第十六章 Qt的文件處理操作詳解

目錄 一、基本文件操作 二、二進制文件讀寫 三、文本文件讀寫 四、操作例子 1、QTextStream的流操作符 一、基本文件操作 文件操作是應用程序必不可少的部分。Qt 作為一個通用開發庫,提供了跨平臺的文件操作能力。在所有的 I/O 設備中,文件 I/O 是最重要的部分之…

TF-IDF和BM25原理和區別

TF-IDF TF-IDF是TF&#xff08;詞頻&#xff0c;Term Frequency&#xff09;和IDF&#xff08;逆文檔頻率&#xff0c;Inverse Document Frequency&#xff09;的乘積。我們先來看他們分別是怎么計算的&#xff1a; TF的計算有多種方式&#xff0c;常見的是 除以文章總詞數是…