類型系統已經執行大量這樣的安全功能。這實質上就是對於。
對於一個非常簡單的示例,它可以防止您將float作爲int處理。這是安全性的一個方面 - 它保證您正在使用的類型將按預期行事。它保證只對字符串調用字符串方法。例如,大會沒有這種保護措施。
這也是類型系統的工作,以確保您不要在一個類上調用私有函數。這是另一個安全功能。
Java的類型系統是太貧血有效地執行了很多有趣的制約,但在許多其他語言(包括C++),類型系統可以用來執行更廣泛的規則。
在C++中,模板元編程爲您提供了很多工具,禁止「壞」的代碼。例如:
class myclass : boost::noncopyable {
...
};
在編譯時強制該類不能被複制。下面將產生編譯錯誤:
myclass m;
myclass m2(m); // copy construction isn't allowed
myclass m3;
m3 = m; // assignment also not allowed
同樣,我們可以保證在一個模板函數只被調用上達到一定的標準(比如,他們必須是隨機訪問迭代器類型的編譯時間,而雙線性者是不允許的,或者它們必須是POD類型,或者它們不能是任何類型的整數類型(char,short,int,long),但是所有其他類型都應該合法。
模板元編程的教科書示例在C++中實現了一個用於計算物理單位的庫,它允許您將「meter」類型的值與另一個相同類型的值相乘,並自動確定結果必須是「square meter」類型。類型「英里」的類型爲「小時」類型的值,並獲得「每小時英里數」類型的單位。
同樣,這是一種安全功能,可防止您混淆您的類型並意外地混淆您的單位。如果您計算一個值並嘗試將其分配給錯誤的類型,則會出現編譯錯誤。試圖用meters^2
來分割,例如,將結果賦值爲千克等值會導致編譯錯誤。
大部分,這需要一些手動設置工作,當然,但語言給你,你需要基本建成你想要的類型檢查的工具。其中一些可以直接用語言更好地支持,但是更有創意的檢查在任何情況下都必須手動實施。
這也在播客58(http://blog.stackoverflow.com/2009/06/podcast-58/) – Brian 2009-07-31 18:58:58
討論它基本上是一個什麼類型的系統*是*。沒有類型系統,任何變量都可以被視爲任何其他變量。你可以通過將一個int作爲一個double來訪問出界限內存。這可以讓你得到4個字節的值超過int的結尾。或無符號整數可防止您意外存儲已簽名的值。 (儘管他們默默地轉換它的方式並不理想) – jalf 2009-07-31 19:35:01
好吧,但是好像我們可以在類型系統中強制執行更高級別的屬性,這與我們如何操作數據表示形式無關。我想,基本上將類型系統進一步引入業務邏輯。 – 2009-07-31 19:51:08