首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C/C++ 區域類與嵌套類詳解:作用域、訪問權限與應用場景

     編輯:C++ 入門

引言

C++ 允許在函數內部定義類(區域類),也允許在類內部定義類(嵌套類/內部類)。兩者雖然語法相似,但語義、作用域規則、訪問權限有本質區別。本文參考《C++ 程式設計思想》《高質量程式設計指南》及網絡資料,系統整理相關知識點。

一、區域類

定義與特性

  • 定義在函數內部的類。
  • 類及其對象的作用域僅限於該函數內。
  • 所有成員函數必須在類內定義(不能在類外實現),因為 C++ 不允許函數嵌套定義。
  • 若含靜態數據成員,必須在函數外初始化;不能有靜態函數成員。
  • 不能使用包裹它的函數中定義的非靜態局部變量(只能用靜態局部變量或全局變量)。

與 Java 內部類的關鍵區別

C++ 區域類對象沒有外部函數/類對象的指針,不能訪問外部非靜態成員;
Java 非靜態內部類對象持有外部類對象引用,能自由訪問外部非靜態成員。

示例 1:基本用法

int a; // 全局變量
void fun() {
    static int s; // 靜態局部變量,區域類可訪問
    class A {
    public:
        void init(int i) { s = i; } // 只能訪問靜態/全局變量
    };
    A m; m.init(10);
}

示例 2:實現類型轉換(適配器模式)

class Interface { public: virtual void Fun() = 0; };

template <class T, class P>
Interface* MakeAdapter(const T& obj, const P& arg) {
    int x; // 局部變量,區域類不可直接訪問
    class Local : public Interface {
    public:
        Local(const T& o, const P& a) : obj_(o), arg_(a) {}
        virtual void Fun() { x = 100; obj_.Call(arg_); } // 錯誤:不能訪問 x
    private:
        T obj_; P arg_;
    };
    return new Local(obj, arg);
}

註:上例中 `x` 無法被 `Local` 訪問,若需使用需改為 `static int x;` 或通過構造函數傳入。

二、嵌套類

定義與特性

  • 定義在另一個類(外圍類)內部的類。
  • 作用域限於外圍類內;外界若需使用,需以 Outer::Inner 形式訪問,且受訪問權限控制。
  • 成員函數可以在類外定義(不同於區域類)。
  • 嵌套類與外圍類互為獨立類:嵌套類成員函數無權訪問外圍類的非靜態成員,反之亦然。友元關係也不傳遞。

定義嵌套類的目的

隱藏類名,減少全局標識符污染,限制用戶直接構造對象,提高封裝性,強調「主從」關係。

示例:嵌套類基本結構

class A {
public:
    class B { // 嵌套類
    public:
        void func(); // 可在類外定義
    private:
        int b_data;
    };
    void f();
private:
    int a;
};

// 類外定義嵌套類成員函數
void A::B::func() { /* ... */ }

嵌套類的若干說明

  1. 作用域:嵌套類名隱藏在外圍類中,外部使用需加作用域限定符 `A::B`。
  2. 訪問權限:嵌套類名遵循同樣的 public/protected/private 規則。
  3. 無隱含訪問權:嵌套類對象不包含外圍類對象指針,不能直接訪問外圍類非靜態成員(需傳遞外圍類對象引用/指針)。
  4. 友元不傳遞:嵌套類的友元無法訪問外圍類私有成員。
  5. 複雜嵌套類可前置聲明:在外圍類中聲明 `class B;`,詳細定義放在類外(文件域)。

本質上是語法嵌入

以下兩種寫法在語義上幾乎等價:

// 寫法 1:嵌套
class A { public: class B { ... }; private: int a; };

// 寫法 2:分離
class A { public: void f(); private: int a; };
class B { public: ... private: ... };

嵌套類僅提供名字隱藏和邏輯分組,不改變類之間的訪問關係。

總結對比表

特性區域類嵌套類
定義位置函數內部類內部
作用域僅限該函數限於外圍類
成員函數定義必須在類內可在類外
訪問外部變量僅靜態/全局無隱含權限(需傳遞引用)
靜態成員僅靜態數據成員(外部初始化),無靜態函數成員正常支援
主要用途封裝函數內邏輯、實現介面適配隱藏實現細節、組織相關類型
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved