85805


提示コードですが以下のコードは`static`の各意味について整理してコメントを書いたものです。以下の`static`の理解は正しいのでしょうか？
また`質問したいこと`部について知りたいです。

##### 非クラスにおける`static`

グローバル`static`変数は`static`関数や普通の関数からアクセスできる、また利用範囲がそのソースファイルに制限される。ヘッダーファイルの場合はインクルードしたソースファイルでも利用できる。その際に値は共有される。  
`static`関数は普通の関数、変数も参照出来る。

##### クラスにおける`static`

`static`変数は普通の関数や`static`関数から参照できる`static`メンバ変数は一回外で宣言しないといけない。初期値は設定しなくても０が自動で入る(`int`型の場合)  
`static`関数は`static`変数と`static`関数しか参照出来ない。

# 知りたい事

##### 1

static class t といったクラスの前にstaticを付けることが出来るがその場合こんな警告が出るがどいう意味なのか知りたい。  
`'static ': 変数が何も宣言されていないときは、'Test' の左辺を無視します。`

##### 2

スタックに確保されることによってどんな意味がるのか？

##### 3

その他`static`に関して知っておくべきことが知りたい。

##### Main.cpp

[code]

    #include <iostream>
    #include "Test.hpp"
    
    
    static int global_Var;
    int test_Var = 0;
    
    static Test test;   //static クラスも出来る
    
    
    
    void AddFunction();
    void AddFunction()
    {
        global_Var++;
        static int t;
        t++;
    //  staticFunction();
        std::cout << "AddFunction() t: " << t << std::endl;
    }
    
    static void staticFunction();
    static void staticFunction()
    {
        test_Var = 3;
    
        AddFunction();
        test_Var = 2;
        std::cout << "static Function" << std::endl;
    }
    
    
    
    int main()
    {
        std::cout << staticTestCpp << std::endl;
        sample::Init();
        std::cout << sample::staticSample_Var << std::endl;
    
        AddFunction();
        AddFunction();
        AddFunction();
        AddFunction();
    
        staticFunction();
    
        Test test;
    
        //std::cout << Test::staticTest_Var << std::endl;   //staticメンバ関数は初期化しないと参照出来ない
        std::cout << Test::staticTest_Var << std::endl;
        std::cout << global_Var << std::endl;
    
    
        return 0;
    }
    
[/code]

##### Test.hpp

[code]

    #ifndef ___TEST_HPP___
    #define ___TEST_HPP___
    
    //int testCpp;  //やってはならない
    
    static int staticTestCpp;
    
    
    
    /* ### インスタンス生成     可能 ###*/
    static class Test
    {
    public:
        Test();
    
        static void staticTest_Method();
        const static int staticTest_Var_Const = 0;  //宣言と同時に初期化するにはconstでないとエラーになる。
        static int staticTest_Var;
    
    private:
    
    };
    
    //int Test::staticTest_Var = 0; //ここでは初期化できない。
    
    
    
    /* ### インスタンス生成     不可 ###*/
    class sample
    {
    public:
        void Method();
    
        static void Init();
    
        static void staticSample_Method();
    
        static int staticSample_Var;
    
        int sample_Var;
    private:
        sample();
    
    };
    #endif
    
[/code]

##### Test.cpp

[code]

    #include "Test.hpp"
    #include <iostream>
    
    /* ### Test　class ###*/
    int Test::staticTest_Var;   //static変数は初期値を入れなくても自動で０が入る。
    Test::Test()
    {
        std::cout << "test　コンストラクタ" << std::endl;
    }
    
    void Test::staticTest_Method()
    {
        std::cout << "test static メンバ関数" << std::endl;
    }
    
    /* ### sample　class ###*/
    int sample::staticSample_Var = 23;  //static メンバ変数は必ず外で初期化
    void sample::Init()
    {
        //Method(); //普通の関数は参照出来ない。
        //sample_Var = 2;   //staticメンバ関数はstatic変数しか参照出来ない。
        staticSample_Var = 2;   
        std::cout << "sample　Init" << std::endl;
    }
    
    void sample::Method()
    {
        sample_Var = 2;
        staticSample_Var = 2;   //static変数でも普通の関数では参照できる。
    }
    
    sample::sample()
    {
        std::cout << "sample　コンストラクタ" << std::endl;
    }
    
    void sample::staticSample_Method()
    {
        std::cout << "sample static メンバ関数" << std::endl;
    }
    
    
    
[/code]


CC BY-SA 4.0
2022-01-16T03:56:32.517
85724
2022-01-19T20:39:35.140
2022-01-19T20:17:23.080
4236
question
c++
staticの意味を整理したい。


> static class t といったクラスの前にstaticを付けることが出来るがその場合こんな警告が出るがどいう意味なのか知りたい。

[staticメンバ関数の実行される時が知りたい](https://ja.stackoverflow.com/q/85576/4236)と同じくそもそも「宣言」を正しく理解していない可能性があります。C++言語には「宣言」と「定義」が存在します。

[code]

    // 変数の宣言
    extern int a;
    // 変数の定義
    int a;
    
[/code]

[code]

    // 関数の宣言
    int b();
    // 関数の定義
    int b() {
      ...;
    }
    
[/code]

[code]

    // クラスの宣言
    class c;
    // クラスの定義
    class c {
      ...;
    };
    
[/code]

そして質問文を読む限り`static`については概ね理解できているように **変数** と **関数** に付けられますし、逆に **クラス**
には付けられません。

ではなぜ`static class t`が認められつつ警告されるのかですが、これは

[code]

    // クラスtの宣言
    class t;
    // 変数vの定義
    static class t v;
    
[/code]

このように変数の定義につながる可能性があるために一旦受け入れられつつ、しかし実際はクラスの宣言だったため`static`は不要だと警告されるわけです。

* * *

> ヘッダーファイルの場合はインクルードしたソースファイルでも利用できる。その際に値は共有される。

試せばわかりますが、共有されません。  
その代わり、C++17にて[インライン変数](https://cpprefjp.github.io/lang/cpp17/inline_variables.html)という機能が追加され、こちらを使うと共有されるようになります。


CC BY-SA 4.0
2022-01-19T20:39:35.140
85805
2022-01-19T20:39:35.140
4236
85724
answer