C++ 関数における static キーワードの適用シナリオは何ですか?

王林
リリース: 2024-04-11 21:51:02
オリジナル
772 人が閲覧しました

C の static キーワードを関数に適用すると、次のシナリオを実現できます: プライベート クラス メソッドまたはプロテクト クラス メソッドを定義してクラス内または派生クラスへのアクセスを実現する; プログラム内のどこからでも関数にアクセスできるようにグローバル関数を作成する;スレッドセーフ機能を作成して、同時環境での安全な使用を保証します。

C++ 函数static关键字的应用场景有哪些?

C 関数の静的キーワードのアプリケーション シナリオ

static キーワードは C の In 関数で広く使用されています宣言により、関数のスコープと有効期間が制御されます。主要なアプリケーション シナリオの一部を以下に示します:

1. プライベート クラス メソッドまたは保護されたクラス メソッドを定義する

static 関数はプライベートまたは保護されたものとして宣言できます。クラス内または派生クラス内でのみアクセスできることを意味します。これは、内部管理のみに使用されるユーティリティ関数を作成する場合に便利です。

2. グローバル関数の作成

#static 関数はグローバル スコープで定義できるため、プログラム内のどこからでもアクセスできます。 。これは、ライブラリ関数またはユーティリティ関数を作成する場合に便利です。

3. スレッド セーフな関数を作成する

static 関数はスレッド セーフであるため、同時環境で安全に使用できます。これは、それらは単一のコピーとしてのみ存在し、同時アクセスによって変更されないためです。

実際的なケース:

プライベート静的関数:

class MyClass {
public:
    void foo() {
        static int count = 0;  // 私有静态变量
        count++;
        std::cout << "Call count: " << count << std::endl;
    }
};

int main() {
    MyClass obj;
    obj.foo();  // 输出:Call count: 1
    obj.foo();  // 输出:Call count: 2
    // count 变量只在 foo() 方法中可见,不能从主函数中访问。
}
ログイン後にコピー

保護された静的関数:

class Base {
protected:
    static int value;  // 受保护静态变量
};

class Derived : public Base {
public:
    static void set_value(int v) {
        Base::value = v;  // 可以访问基类的受保护静态成员
    }

    static int get_value() {
        return Base::value;  // 可以访问基类的受保护静态成员
    }
};

int main() {
    Derived::set_value(100);
    std::cout << "Value: " << Derived::get_value() << std::endl;  // 输出:Value: 100
    // 只能通过 Derived 类访问 value 变量,因为它继承了 Base 类。
}
ログイン後にコピー

グローバル静的関数:

static int global_count = 0;  // 全局静态变量

int increment_count() {
    return ++global_count;  // 返回并递增全局计数器
}

int main() {
    std::cout << increment_count() << std::endl;  // 输出:1
    std::cout << increment_count() << std::endl;  // 输出:2
    // 全局计数器在程序的整个生命周期中都可以访问。
}
ログイン後にコピー

スレッドセーフな静的関数:

class ThreadSafeClass {
public:
    static int get_random_number() {
        static std::random_device rd;  // 静态随机数生成器
        static std::mt19937 gen(rd());
        return gen();
    }
};

int main() {
    std::thread t1([] {
        for (int i = 0; i < 10000; i++) {
            ThreadSafeClass::get_random_number();
        }
    });

    std::thread t2([] {
        for (int i = 0; i < 10000; i++) {
            ThreadSafeClass::get_random_number();
        }
    });

    t1.join();
    t2.join();
    // 即使从多个线程并发访问,get_random_number 函数也能生成线程安全的随机数。
}
ログイン後にコピー

以上がC++ 関数における static キーワードの適用シナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!