首頁  >  問答  >  主體

C++中static函数 类外定义的时候为什么不写static

class A{
    static void foo();
}

void A::foo(){
    ....
}

为什么定义的时候不能写static了?

巴扎黑巴扎黑2765 天前633

全部回覆(2)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:49:53

    設想如果你的class A裡有兩個foo()函數:

        class A{
            static void foo();
            void foo();
        };
    

    這樣為了區分它們,你在定義的時候才需要寫static:

        static void A::foo(){
            //....
        }
        void A::foo(){
            //....
        }
    

    然而C++編譯器在區分函數時不把有無static關鍵字考慮在內,而只看函數名,返回類型和參數表,void foo();和static void foo();被視為重複聲明,是被禁止的,也就是說一個類別裡面只能有一個void foo();函數,不管它是static還是非static。為什麼呢?
    再設想class A有另一個函數void bar();定義如下:

        void A::bar(){
            //....
            foo();
            //....
        }
    

    這種寫法差不多算是一種慣例吧,在函數bar()內呼叫函數foo()的時候是直接寫foo();而不會寫上函數宣告時使用的static,const等關鍵字,這樣如果你有void foo()還有一個staic void foo(),編譯器是無法區分你呼叫的是哪個foo()的;
    既然只能有一個void foo(),那麼你在定義它的時候也就沒必要再寫一次static了,編譯器已經知道它是哪個函數了。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 11:49:53

    static用於修飾成員變數或成員函數時,只在宣告時在類別的內部宣告即可,實例化或定義的時候不用加static。

    class A{
       static int n ;
    };
    
    int A::n = 123;
    

    回覆
    0
  • 取消回覆