天天看點

【靜态類型/動态類型】弱類型、強類型、靜态類型和動态類型 靜态綁定和動态綁定

弱類型、強類型、動态類型、靜态類型語言的差別是什麼?

強類型:偏向于不容忍隐式類型轉換。譬如說haskell的int就不能變成doubl 

弱類型:偏向于容忍隐式類型轉換。譬如說c語言的int可以變成double 

靜态類型:編譯的時候就知道每一個變量的類型,因為類型錯誤而不能做的事情是文法錯誤。 

動态類型:編譯的時候不知道每一個變量的類型,因為類型錯誤而不能做的事情是運作時錯誤。譬如說你不能對一個數字a寫a[10]當數組用。

【靜态類型/動态類型】弱類型、強類型、靜态類型和動态類型 靜态綁定和動态綁定

弱類型:

 強類型:

動态類型:

靜态類型:

什麼意思?你可能會說你不懂這些最新的面向對象術語;或者,過度勞累的你一時想不起靜态和動态綁定的差別。那麼,讓我們來複習一下。

先說明:靜态類型和動态類型==靜态綁定和動态綁定,(兩者是一個意思,說法不一樣而已)嘿嘿

對象的靜态類型是指你聲明的存在于程式代碼文本中的類型。看下面這個類層次結構:

enum shapecolor { red, green, blue };

// 一個表示幾何形狀的類

class shape

...

};

class rectangle: public shape

class circle: public shape {

用圖形來表示是下面這樣:

       shape

      /    \

     /      \

    /        \

rectangle   circle

現在看看這些指針:

shape *ps;                 // 靜态類型 = shape*

shape *pc = new circle;    // 靜态類型 = shape*

shape *pr = new rectangle; // 靜态類型 = shape*

這個例子中, ps, pc,和pr都被聲明為shape指針類型,是以它們都以此作為自己的靜态類型。

注意,這和它們真的所指向的對象的類型絕對沒有關系 ---- 它們的靜态類型總是shape*。

對象的動态類型是由它目前所指的對象的類型決定的。即,對象的動态類型表示它将執行何種行為。上面的例子中,pc的動态類型是circle*,pr的動态類型是rectangle*。至于ps,實際上沒有動态類型,因為它(還)沒有指向任何對象。

動态類型,顧名思義,可以在程式運作時改變,典型的方法是通過指派:

ps = pc; // ps的動态類型 // 現在是circle*

ps = pr; // ps的動态類型 // 現在是rectangle*

注:虛函數是動态綁定的,意思是說,虛函數通過哪個對象被調用,具體被調用的函數就由那個對象的動态類型決定

繼續閱讀