弱類型、強類型、動态類型、靜态類型語言的差別是什麼?
強類型:偏向于不容忍隐式類型轉換。譬如說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*
注:虛函數是動态綁定的,意思是說,虛函數通過哪個對象被調用,具體被調用的函數就由那個對象的動态類型決定