【C++特殊工具與技術】嵌套類

在 C++ 中,類的嵌套(Nested Class)是一種強大的封裝手段。通過將一個類定義在另一個類(稱為外圍類,Enclosing Class)的內部,我們可以將關聯緊密的功能邏輯集中管理,同時限制嵌套類的作用域,避免命名沖突。這種特性在 STL(如vector::iterator)、設計模式(如迭代器模式、狀態模式)以及框架開發中被廣泛使用。

目錄

一、嵌套類的基本概念與核心價值

1.1 什么是嵌套類?

1.2 為什么需要嵌套類?

二、嵌套類的實現細節

2.1 嵌套類的定義位置與訪問控制

2.2 嵌套在類模板內部的類:模板嵌套類

2.3 定義嵌套類的成員

2.4 嵌套類的靜態成員定義

2.5 嵌套類使用外圍類的成員

2.6 嵌套類使用外圍類的類型別名

2.7 嵌套模板的實例化

三、嵌套類作用域中的名字查找

3.1 基本名字查找規則

3.2 成員重名的處理

3.3 模板嵌套類的名字查找特殊性

四、嵌套類的典型應用場景

4.1 STL 中的迭代器設計

4.2 狀態模式的實現

五、嵌套類的優缺點分析

5.1 優點

5.2 缺點

六、總結?


一、嵌套類的基本概念與核心價值

1.1 什么是嵌套類?

嵌套類是定義在另一個類內部的類,其作用域被限制在外圍類的作用域內。例如:

class Outer {
public:class Inner {  // Inner是嵌套類,作用域為Outer內部public:void print() { std::cout << "Nested Class\n"; }};
};

關鍵特性

  • 嵌套類是獨立的類型,與外圍類的對象無隱含關聯(即嵌套類的對象不持有外圍類的this指針);
  • 嵌套類可以訪問外圍類的public/protected靜態成員(非靜態成員需通過外圍類對象訪問);
  • 外圍類對嵌套類的成員無特殊訪問權限(需遵循訪問控制規則)。

1.2 為什么需要嵌套類?

  • 邏輯內聚:將與外圍類強相關的輔助類(如迭代器、狀態處理器)嵌套在外圍類中,使代碼結構更清晰;
  • 封裝性:嵌套類的作用域被限制在外圍類內部,避免與全局作用域的類名沖突;
  • 接口簡化:用戶只需關注外圍類的公共接口,嵌套類的實現細節被隱藏(如std::vector::iterator)。

二、嵌套類的實現細節

2.1 嵌套類的定義位置與訪問控制

嵌套類可以定義在外圍類的publicprotectedprivate區域,其訪問權限決定了外部代碼能否直接使用該嵌套類:

外圍類中嵌套類的位置外部代碼能否直接使用嵌套類典型場景
public是(需通過Outer::Inner訪問)暴露輔助接口(如迭代器)
protected否(僅外圍類的派生類可訪問)內部實現細節(如基類的狀態管理)
private否(僅外圍類內部可訪問)完全隱藏的輔助類(如數據結構的節點)

示例

class Outer {
private:class PrivateInner {  // 私有嵌套類,外部無法直接使用public:void privateFunc() { std::cout << "Private Inner\n"; }};protected:class ProtectedInner {  // 保護嵌套類,僅派生類可訪問public:void protectedFunc() { std::cout << "Protected Inner\n"; }};public:class PublicInner {  // 公共嵌套類,外部可通過Outer::PublicInner訪問public:void publicFunc() { std::cout << "Public Inner\n"; }};
};int main() {Outer::PublicInner obj;  // 合法obj.publicFunc();        // 輸出:Public Inner// Outer::PrivateInner obj2;  編譯錯誤:PrivateInner是私有嵌套類// Outer::ProtectedInner obj3; 編譯錯誤:ProtectedInner是保護嵌套類return 0;
}

2.2 嵌套在類模板內部的類:模板嵌套類

如果外圍類是模板類,嵌套類可以繼承外圍類的模板參數,成為模板嵌套類。此時,嵌套類的模板參數可以與外圍類相同,也可以獨立定義。

① 繼承外圍類模板參數的嵌套類

語法:嵌套類直接使用外圍類的模板參數。?

template <typename T>
class Container {
public:class Iterator {  // 嵌套類,使用外圍類的模板參數Tprivate:T* ptr;  // 指向T類型的指針public:Iterator(T* p) : ptr(p) {}T& operator*() { return *ptr; }};private:T data[10];
};

實例化規則:當外圍類Container<T>實例化為Container<int>時,嵌套類Iterator自動變為Container<int>::Iterator,其內部的T被替換為int

②獨立模板參數的嵌套類

嵌套類也可以定義自己的模板參數,與外圍類的模板參數無關。

template <typename T>
class OuterTemplate {
public:template <typename U>  // 嵌套類是獨立模板,有自己的參數Uclass NestedTemplate {private:T outerData;  // 使用外圍類的模板參數TU nestedData; // 使用自己的模板參數Upublic:NestedTemplate(T t, U u) : outerData(t), nestedData(u) {}void print() {std::cout << "Outer: " << outerData << ", Nested: " << nestedData << "\n";}};
};// 使用示例
int main() {// 外圍類實例化為OuterTemplate<double>// 嵌套類實例化為NestedTemplate<std::string>OuterTemplate<double>::NestedTemplate<std::string> obj(3.14, "Hello");obj.print();  // 輸出:Outer: 3.14, Nested: Helloreturn 0;
}

2.3 定義嵌套類的成員

嵌套類的成員(函數、數據)可以在嵌套類內部直接定義,也可以在外圍類外部定義(需使用作用域限定符)。

①內部定義成員

最常見的方式是在嵌套類的大括號內直接定義成員函數:

class Outer {
public:class Inner {public:void func() {  // 直接在嵌套類內部定義函數std::cout << "Inner function\n";}};
};

②外圍類外部定義成員

如果成員函數較長或需要分離聲明與實現,可以在外圍類外部定義嵌套類的成員。此時需使用外圍類::嵌套類的作用域限定。

class Outer {
public:class Inner {public:void func();  // 聲明函數};
};// 在外圍類外部定義嵌套類的成員函數
void Outer::Inner::func() {  // 關鍵:作用域限定符為Outer::Innerstd::cout << "Inner function defined outside\n";
}int main() {Outer::Inner obj;obj.func();  // 輸出:Inner function defined outsidereturn 0;
}

2.4 嵌套類的靜態成員定義

嵌套類可以聲明靜態成員(靜態數據成員或靜態成員函數)。靜態成員的存儲必須在外圍類外部定義(除非使用內聯)。

示例:嵌套類的靜態成員

class Outer {
public:class Inner {public:static int count;  // 靜態數據成員聲明static void printCount() {  // 靜態成員函數定義在內部std::cout << "Count: " << count << "\n";}};
};// 在外圍類外部定義靜態數據成員(必須)
int Outer::Inner::count = 0;  // 關鍵:作用域限定符為Outer::Innerint main() {Outer::Inner::count = 10;  // 通過嵌套類名訪問靜態成員Outer::Inner::printCount();  // 輸出:Count: 10return 0;
}

2.5 嵌套類使用外圍類的成員

嵌套類可以訪問外圍類的成員,但需遵循以下規則:

①訪問外圍類的靜態成員

嵌套類可以直接訪問外圍類的public/protected靜態成員(包括靜態數據成員和靜態成員函數),無需依賴外圍類的對象。

示例

class Outer {
public:static int staticValue;  // 外圍類的靜態數據成員static void staticFunc() { std::cout << "Outer static function\n"; }class Inner {public:void useOuterStatic() {staticValue = 20;       // 直接訪問外圍類的靜態數據成員staticFunc();           // 直接調用外圍類的靜態成員函數}};
};int Outer::staticValue = 10;  // 定義外圍類的靜態數據成員int main() {Outer::Inner obj;obj.useOuterStatic();  // 輸出:Outer static functionstd::cout << "Outer::staticValue: " << Outer::staticValue << "\n";  // 輸出:20return 0;
}

②訪問外圍類的非靜態成員

嵌套類無法直接訪問外圍類的非靜態成員(如普通數據成員或非靜態成員函數),因為這些成員屬于外圍類的具體對象,而嵌套類的對象與外圍類對象無隱含關聯。

若要訪問,需通過外圍類的對象實例(通常由嵌套類的成員函數參數或成員變量提供)。

示例

class Outer {
private:int nonStaticValue = 100;  // 外圍類的非靜態數據成員void nonStaticFunc() { std::cout << "Outer non-static function\n"; }public:class Inner {private:Outer* outerPtr;  // 嵌套類持有外圍類對象的指針public:Inner(Outer* ptr) : outerPtr(ptr) {}  // 通過構造函數傳入外圍類對象void useOuterNonStatic() {if (outerPtr) {outerPtr->nonStaticValue = 200;  // 通過指針訪問外圍類的非靜態成員outerPtr->nonStaticFunc();       // 調用外圍類的非靜態成員函數}}};
};int main() {Outer outerObj;Outer::Inner innerObj(&outerObj);  // 傳入外圍類對象的地址innerObj.useOuterNonStatic();      // 輸出:Outer non-static function// 由于nonStaticValue是private,無法直接輸出,這里假設添加public訪問接口return 0;
}

③友元關系:嵌套類訪問外圍類私有成員

如果外圍類希望嵌套類可以訪問其私有成員,需顯式聲明嵌套類為友元(friend)。

示例

class Outer {
private:int privateValue = 50;friend class Inner;  // 聲明嵌套類Inner為友元public:class Inner {public:void accessPrivate(Outer& outer) {outer.privateValue = 100;  // 友元嵌套類可以訪問外圍類的私有成員std::cout << "Modified privateValue: " << outer.privateValue << "\n";}};
};int main() {Outer outerObj;Outer::Inner innerObj;innerObj.accessPrivate(outerObj);  // 輸出:Modified privateValue: 100return 0;
}

2.6 嵌套類使用外圍類的類型別名

外圍類中定義的類型別名(如typedefusing),嵌套類可以直接使用。

示例

class Outer {
public:using ValueType = int;  // 外圍類的類型別名class Inner {public:ValueType data;  // 直接使用外圍類的類型別名void setData(ValueType v) { data = v; }};
};int main() {Outer::Inner obj;obj.setData(42);std::cout << "Inner data: " << obj.data << "\n";  // 輸出:42return 0;
}

2.7 嵌套模板的實例化

當嵌套類本身是模板時,實例化需要同時處理外圍類和嵌套類的模板參數。

示例:雙重模板嵌套

#include <iostream>
#include <cstddef>   // 用于size_t
#include <typeinfo>  // 包含typeid所需的頭文件template <typename T>
class OuterTemplate {
public:template <typename U>class NestedTemplate {private:T outerData;U nestedData;public:NestedTemplate(T t, U u) : outerData(t), nestedData(u) {}void print() {// 使用typeid獲取類型信息,需要包含<typeinfo>std::cout << "Outer(" << typeid(T).name() << "): " << outerData<< ", Nested(" << typeid(U).name() << "): " << nestedData << "\n";}};
};int main() {OuterTemplate<double>::NestedTemplate<std::string> obj1(3.14, "Hello");obj1.print();  // 輸出:Outer(double): 3.14, Nested(basic_string<char,...>): HelloOuterTemplate<char>::NestedTemplate<int> obj2('A', 65);obj2.print();  // 輸出:Outer(char): A, Nested(int): 65return 0;
}

三、嵌套類作用域中的名字查找

在嵌套類的成員函數中,名字查找(Name Lookup)遵循 “從內到外” 的規則:先檢查嵌套類自身的作用域,再檢查外圍類的作用域,最后檢查全局作用域。

3.1 基本名字查找規則

示例

int globalVar = 100;  // 全局變量class Outer {
public:int outerVar = 200;  // 外圍類的成員變量class Inner {public:int innerVar = 300;  // 嵌套類的成員變量void printVars() {std::cout << "innerVar: " << innerVar << "\n";    // 查找嵌套類作用域std::cout << "outerVar: " << outerVar << "\n";    // 錯誤:outerVar是外圍類的非靜態成員,嵌套類無法直接訪問std::cout << "globalVar: " << globalVar << "\n";  // 查找全局作用域}};
};

修正:嵌套類訪問外圍類的非靜態成員需通過外圍類對象:

void printVars(Outer& outer) {  // 添加外圍類對象參數std::cout << "innerVar: " << innerVar << "\n";    // 300std::cout << "outerVar: " << outer.outerVar << "\n";  // 200(通過對象訪問)std::cout << "globalVar: " << globalVar << "\n";  // 100
}

3.2 成員重名的處理

如果嵌套類的成員與外圍類的成員(或全局變量)重名,默認訪問嵌套類自身的成員。若要訪問外圍類或全局的成員,需使用作用域限定符(::)。

示例

int var = 10;  // 全局變量class Outer {
public:int var = 20;  // 外圍類的成員變量class Inner {public:int var = 30;  // 嵌套類的成員變量void printVars() {std::cout << "var: " << var << "\n";          // 30(嵌套類自身的var)std::cout << "Outer::var: " << Outer::var << "\n";  // 錯誤:Outer::var是非靜態成員,無法直接訪問std::cout << "global var: " << ::var << "\n";  // 10(全局變量)}};
};// 修正:通過外圍類對象訪問重名的非靜態成員
void printVars(Outer& outer) {std::cout << "var: " << var << "\n";          // 30std::cout << "Outer::var: " << outer.var << "\n";  // 20(通過對象訪問外圍類的var)std::cout << "global var: " << ::var << "\n";  // 10
}

3.3 模板嵌套類的名字查找特殊性

在模板嵌套類中,名字查找需要考慮模板參數的依賴性。若名字依賴于模板參數(依賴名稱,Dependent Name),編譯器無法在實例化前確定其類型,需顯式使用typenamethis->關鍵字。

示例:依賴名稱的處理

template <typename T>
class OuterTemplate {
public:using OuterType = T;  // 外圍類的類型別名(依賴模板參數T)class InnerTemplate {private:OuterType innerData;  // OuterType依賴T,是依賴名稱public:InnerTemplate(OuterType data) : innerData(data) {}void print() {// 錯誤:編譯器無法確定OuterType是否是類型(可能是變量)// std::cout << "Size: " << sizeof(OuterType) << "\n";// 正確:使用typename顯式聲明OuterType是類型std::cout << "Size: " << sizeof(typename OuterTemplate<T>::OuterType) << "\n";}};
};int main() {OuterTemplate<int>::InnerTemplate obj(42);obj.print();  // 輸出:Size: 4(int的大小)return 0;
}

關鍵規則

  • 依賴名稱(如OuterType)在模板上下文中需用typename聲明其為類型;
  • 訪問外圍類的非靜態成員時,需通過this->或外圍類對象明確作用域(避免與嵌套類成員重名)。

四、嵌套類的典型應用場景

4.1 STL 中的迭代器設計

STL 容器(如vectorlist)廣泛使用嵌套類實現迭代器(iterator)。迭代器作為容器的嵌套類,可以直接訪問容器的內部數據結構(如數組指針、鏈表節點),同時隱藏實現細節。

簡化版vector迭代器示例

#include <iostream>
#include <cstddef>  // 用于size_ttemplate <typename T>
class Vector {
private:T* data;   size_t size;   public:// 嵌套類:迭代器class Iterator {private:T* ptr;  // 迭代器內部指針public:// 構造函數Iterator(T* p) : ptr(p) {}// 解引用運算符(*it)T& operator*() { return *ptr; }// 前置++運算符(++it)Iterator& operator++() {ptr++;return *this;}// 不等于運算符(it != other)bool operator!=(const Iterator& other) {return ptr != other.ptr;}// 新增:下標運算符(it[index])T& operator[](size_t index) {return ptr[index];  // 等價于*(ptr + index)}};// 構造函數:按聲明順序初始化成員(先data,后size)Vector(size_t n) : data(new T[n]), size(n) {}// 析構函數:釋放動態內存~Vector() {delete[] data;  // 注意:數組釋放用delete[]}// 返回起始迭代器(指向第一個元素)Iterator begin() { return Iterator(data); }// 返回結束迭代器(指向最后一個元素的下一個位置)Iterator end() { return Iterator(data + size); }
};int main() {Vector<int> vec(3);  // 創建容量為3的Vector// 通過迭代器的operator[]訪問元素(修正后可行)vec.begin()[0] = 10;vec.begin()[1] = 20;vec.begin()[2] = 30;// 使用范圍for遍歷(依賴迭代器的operator++、operator!=、operator*)for (Vector<int>::Iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";  // 輸出:10 20 30}return 0;
}

4.2 狀態模式的實現

狀態模式(State Pattern)中,對象的行為隨狀態變化而變化。通過將狀態類嵌套在外圍類中,可以方便地訪問外圍類的上下文信息。

示例:電梯狀態管理

#include <iostream>class Elevator {
private:class State {  // 嵌套基類:狀態public:virtual void openDoor(Elevator& elevator) = 0;virtual void closeDoor(Elevator& elevator) = 0;};class OpenState : public State {  // 嵌套子類:開門狀態public:void openDoor(Elevator& elevator) override {std::cout << "Door is already open\n";}void closeDoor(Elevator& elevator) override {std::cout << "Door closed\n";elevator.currentState = &elevator.closedState;  // 切換到關門狀態}};class ClosedState : public State {  // 嵌套子類:關門狀態public:void openDoor(Elevator& elevator) override {std::cout << "Door opened\n";elevator.currentState = &elevator.openState;  // 切換到開門狀態}void closeDoor(Elevator& elevator) override {std::cout << "Door is already closed\n";}};State* currentState;  // 當前狀態指針OpenState openState;ClosedState closedState;public:Elevator() : currentState(&openState) {}  // 初始狀態為開門void openDoor() { currentState->openDoor(*this); }void closeDoor() { currentState->closeDoor(*this); }
};int main() {Elevator elevator;elevator.closeDoor();  // 輸出:Door closedelevator.openDoor();   // 輸出:Door openedelevator.openDoor();   // 輸出:Door is already openreturn 0;
}

五、嵌套類的優缺點分析

5.1 優點

  • 封裝性強:嵌套類的作用域被限制在外圍類內部,避免與其他類名沖突;
  • 邏輯內聚:與外圍類強相關的輔助類(如迭代器、狀態)被集中管理,代碼結構更清晰;
  • 訪問控制靈活:通過public/protected/private控制嵌套類的可見性,隱藏實現細節。

5.2 缺點

  • 代碼復雜度:多層嵌套可能導致作用域查找規則復雜,尤其是模板嵌套時;
  • 編譯依賴:嵌套類的修改可能觸發外圍類的重新編譯,影響構建效率;
  • 對象關聯限制:嵌套類對象不隱含持有外圍類對象的指針,需顯式傳遞,增加代碼冗余。

六、總結

嵌套類是 C++ 中實現高內聚、低耦合設計的重要工具。通過本文的學習,我們覆蓋了以下核心知識點:

知識點關鍵細節
嵌套類定義與訪問控制嵌套類可定義在public/protected/private區域,決定外部可見性
模板嵌套類嵌套類可繼承外圍類模板參數,或定義獨立模板參數
嵌套類成員定義成員可在內部或外部定義(使用外圍類::嵌套類限定符)
靜態成員定義靜態成員需在外圍類外部定義,使用外圍類::嵌套類::成員名
訪問外圍類成員靜態成員可直接訪問,非靜態成員需通過對象或友元關系
名字查找規則從嵌套類→外圍類→全局作用域,重名時需顯式限定
典型應用場景STL 迭代器、狀態模式、輔助類封裝

掌握嵌套類后,可以更靈活地設計 C++ 類結構,尤其是在需要隱藏實現細節、集中管理關聯功能的場景中。當然,在實際開發中需權衡嵌套深度和代碼復雜度,避免過度設計。

思考題:如何設計一個嵌套類,實現對外圍類私有數據的安全訪問(既允許嵌套類修改數據,又防止外部直接修改)?(提示:結合友元與單例模式)


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

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

相關文章

Python安裝cartopy報錯,解決cartopy環境配置問題

1、嘗試過各種辦法&#xff0c;說依賴包的問題&#xff0c;下載了沒用&#xff0c;說版本問題沒用。conda安裝成功了&#xff0c;運行仍然報錯。采用了一個笨辦法解決&#xff08;高效便捷&#xff09;。 用 conda-forge 重建環境&#xff0c;因為依賴混亂&#xff0c;重新創建…

python實戰項目77:足球運動員數據分析

python實戰項目77:足球運動員數據分析 一、數據集介紹二、加載數據集三、查看數據3.1 查看數據大小3.2 查看數據前幾行3.3 查看數據基本信息四、數據預處理4.1 查看并處理缺失值4.2 查看并處理重復值五、運動員身高和體重分布5.1 查看身高和體重列數據情況5.2 數據類型轉換5.3…

安卓官方版fat-aar:使用Fused Library將多個Android庫發布為一個庫

安卓官方版fat-aar:使用Fused Library將多個Android庫發布為一個庫 - Wesley’s Blog 在開發 sdk 時&#xff0c;內部一般會劃分好幾個模塊。但當需要打包成一個模塊發布時&#xff0c;往往需要依賴第三方插件。比如著名的 fat-aar&#xff1a;https://github.com/kezong/fat-…

VR看房:重塑房地產行業生態的技術革命

在科技浪潮的席卷下&#xff0c;虛擬現實&#xff08;VR&#xff09;技術正深刻重塑房地產行業格局。VR看房這一創新模式的興起&#xff0c;打破了傳統看房的諸多限制&#xff0c;從根本上變革了購房者的看房體驗&#xff0c;也為房地產企業的運營帶來全新契機與挑戰。 一、VR…

vscode+react+ESLint解決不引入組件,vscode不會報錯的問題

解決不引入組件&#xff0c;vscode不會報錯的問題 routes.jsx 全部代碼如下 export const routes [{path:"/",element:<Home/>} ]在項目根目錄下新建個 eslint.config.js 加入下面的代碼&#xff0c;要保證node_modules里安裝了 eslint-plugin-react&a…

Android制作AAR包并混淆后加載調用

為將部分算法代碼封裝為AAR包供其他項目調用&#xff0c;我基于零經驗的情況搭建了一個Demo進行功能驗證&#xff0c;在此記錄流程以備后續參考。 1、新建一個Android Project&#xff0c;選擇No Activity 2、創建 MyClasses 類用于封裝相關代碼 3、創建taar包并在其中定義MyAl…

常見應用層協議介紹

在計算機網絡中,應用層協議是 OSI 模型中的最高層,負責為用戶提供直接的網絡服務。 一、基于TCP的協議 應用層協議端口號基于的傳輸層協議關鍵特性HTTP80TCP無狀態、明文傳輸HTTPS443TCP (TLS加密)HTTP+SSL/TLS加密FTP20(數據)/21(控制)TCP雙通道傳輸、支持認證SSH22TCP加密替…

分享兩個可以一鍵生成sql server數據庫 html格式巡檢報告的腳本

方法一&#xff1a;使用sqlcmd C:\>sqlcmd -S LAPTOP-25D4U18P -i C:\sqlserver_check_html.sql -o C:\check\report.html -h-1 -f 65001sqlserver_check_html.sql代碼如下&#xff1a; SET NOCOUNT ON; -- 修復錯誤的關鍵設置 SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS…

AI Gateway 介紹

AI 網關和傳統的 API 網關 API 網關發展 在最開始的時候&#xff0c;互聯網通過電話線連接上網&#xff0c;通過“調制解調器&#xff08;Modem&#xff09;”將計算機信號和電話線信號“調制”與“調解”以實現上網功能。當今時代大多使用寬帶上網&#xff0c;撥號上網已被逐…

15.3 LLaMA 3+LangChain實戰:智能點餐Agent多輪對話設計落地,訂單準確率提升90%!

LLaMA 3LangChain實戰&#xff1a;智能點餐Agent多輪對話設計落地&#xff0c;訂單準確率提升90%&#xff01; 關鍵詞&#xff1a;多輪對話設計、場景化提示工程、LLaMA 3 微調、LangChain Agent、飯店點餐場景建模 飯店點餐場景的 Agent 方案設計 通過分層架構實現復雜場景對…

EXPLAIN優化 SQL示例

以下通過 6 個真實案例展示如何使用 EXPLAIN 優化 SQL&#xff0c;每個案例包含問題 SQL、EXPLAIN 分析、優化方案和優化后效果對比&#xff1a; 案例 1&#xff1a;全表掃描優化 (typeALL) 問題 SQL&#xff08;用戶訂單查詢&#xff09;&#xff1a; SELECT * FROM orders …

「Linux文件及目錄管理」通配符與文件名

「Linux文件及目錄管理」通配符與文件名 知識點解析 通配符是Linux中用于匹配文件名的特殊字符,能高效處理批量文件操作。 常見通配符包括: *:匹配任意字符序列(包括空字符)touch a b ab a123 # 創建測試文件 ls a* # 匹配a, ab, a123?:精確匹配單個字符…

服務器配置記錄

1. 獲取服務器IP&#xff0c;用戶&#xff0c;密碼 2. 使用VS Code遠程登錄 下載ssh插件本地cmd執行ssh-keygen -t rsa -b 4096 -C "jt_windows"完成密鑰生成。本地cmd執行type %USERPROFILE%\.ssh\id_rsa.pub查看密鑰并復制。遠程服務器執行以下命令&#xff1a; …

Windows 后滲透中可能會遇到的加密字符串分析

在 Windows 后滲透過程中&#xff0c;攻擊者經常會遇到各種加密字符串或數據&#xff0c;這些數據通常用于存儲敏感信息&#xff0c;如憑據、會話票據或配置數據。理解這些加密字符串的類型、加密機制、存儲位置以及解密方法&#xff0c;對于權限提升、橫向移動和持久化至關重要…

騰訊云本地專用集群CDC:混合云架構下的分布式云服務實踐

摘要 在數字化轉型加速的背景下&#xff0c;企業上云面臨數據合規、低時延、運維復雜度等多重挑戰。騰訊云本地專用集群CDC&#xff08;Cloud Dedicated Cluster&#xff09;通過融合公有云與本地IDC優勢&#xff0c;提供近場云服務解決方案。本文基于IDC行業報告及技術實測數…

wpa_supplicant 源碼學習

代碼地址&#xff1a;git clone https://w1.fi/hostap.git 我目前學的的版本是 wpa_supplicant 2.12-devel-hostap_2_11-857-g54930b62b 五月份左右的提交&#xff0c;是較新的代碼 想做白盒測試。最近開始學習 wpa_supplicant 這個工具。 自學了一個多月吧。 整理了一些代碼跳…

[學習] C語言<string.h>中字符串函數全解析

C語言<string.h>中字符串函數全解析 在 C 語言中&#xff0c;字符串處理是程序開發中的重要組成部分。C 標準庫 <string.h> 提供了一系列函數用于操作字符數組&#xff08;即字符串&#xff09;。這些函數以 str 開頭&#xff0c;功能強大、使用廣泛&#xff0c;掌…

OJ搭建:Judge0服務器、DeepSeek服務接入簡介

序 各大OJ平臺上有很多很好的資源&#xff0c;但作為自己的“備課本”總有各種不便&#xff0c;教學生時間久了總是有一些自己的題目和想法&#xff0c;這在教初學的學生時非常突出。所以&#xff0c;很多年前就搞了一些嘗試&#xff0c;包括&#xff1a;在機房搭建ubuntu服務器…

Java的鎖機制問題

鎖機制 1.鎖監視器 在 Java 并發編程中&#xff0c;鎖監視器&#xff08;Monitor&#xff09; 是對象內部與鎖關聯的同步機制&#xff0c;用于控制多線程對共享資源的訪問。以下是核心要點&#xff1a; &#x1f512; 監視器的核心組成 獨占區&#xff08;Ownership&#xff…

老鳳祥的AI智能眼鏡:讓智慧更近生活

在科技進步的潮流中,人工智能技術不斷為我們的生活增添色彩。近日,有關字節跳動旗下的火山引擎與中國珠寶品牌老鳳祥合作開發 AI 智能眼鏡的消息引發了廣泛關注。這款與眾不同的眼鏡因其獨特的功能及技術支持,已經在業內引起了極大反響。 AI眼鏡:老年群體的智能好幫手 根…