也談C++11裏的auto類型

1.C++的強類型語言特性

C語言本身是一種強類型語言,在C語言基礎之上的C++也是一種強類型語言。在C和C++之中,一切變量(包括函數),都必須明確標明類型。只有類型確定,纔會被編譯器認爲是一種可以接受的語法。

由於C++本身的強類型特性,傳統的C++開發會有很多特點:

1)任何變量和函數都必須明確標明類型;

2)如果兩個不一致類型的變量進行比較或者賦值,要麼報錯,要麼會被隱式轉換(隱式轉換會告警);

3)C++語言本身,或者說面嚮對象語言本身有個重載功能,重要原因是強類型;由於語言本身類型是強類型的,必須對類似功能的函數,進行重載,纔可以具有類似的功能。

當然,強類型語言的優點是:由於類型是強類型,所以在編譯初期,就可以確定語言的類型,導致編譯時候就可以檢查出錯誤;同時,由於類型確定,編譯時可以比較快速確定類型,並快速編譯,然後快速運行。

2.推斷類型語言的崛起

隨着計算機性能的提高,計算機可以飛速運行,甚至可以JIT執行,也就是可以便解釋,邊執行。這也讓計算機可以運行很多“笨重”或者性能不高的語言。

與之相應的,許多不是強類型的語言開始崛起。最具有典型意義的是python;python是一種弱類型的語言;對於該語言來說,任何變量的類型都不是提前聲明的,而是在運行的時候進行推斷的。由於這些語言的類型不是強類型,讓編程語言開發的門檻變得更低。這也讓很多企業和軟件從業者不再過分關注技術和語言本身,而更注重工程性,從而也推動了IT產業的發展。

PS:語言確實只是個工具,IT產業更注重的是工程性,而不是其他。因此,簡單的語言,或者說快速的工程迭代,也是個必然趨勢。

3.auto類型

auto類型,是C++11引進的一種語法。該語法的特點是:不公開聲明變量的類型,而是讓編譯器推斷該變量的類型。該語法和C++傳統的強類型並不一致,但在新的推斷類型語言的崛起之後,也讓C++語言不再固守絕對強類型這一原則。

值得注意是,在其他現代語言中,也借鑑了類型推斷這一特性。諸如Golang這語言,雖然是強類型的,但在函數內部,針對靜態變量,也可以用 := 這一運算符,對變量類型進行推斷。

C++11的auto變量,帶來了很大便利。對於很多C++工程師來說,可以肆無忌憚的進行變量聲明,並不再過分考慮變量類型的適應性。從使用者的角度來講,確實帶來了很多好處。

4.是否要用auto和如何用auto

但C++11的auto變量,也可能帶來很多問題。具體體現爲:

1)這種語法是C++的強類型語言的宗旨相偏離;

2)會造成變量的理解混亂。

因此,我個人的觀點是:

1)不要隨意使用auto,如果類型可以確定的話,避免類型推斷;

2)在非常複雜的變量或者迭代器聲明時,使用auto;因爲,複雜的變量也許並不難理解,只是沒有必要完全寫出來;而迭代器最主要的是迭代的功能,而不是具體類型的確定。

案例如下:

list<int> lstTest;

auto it = lst.begin();

PS:雖然IT產業的特點是工程性,但如果工具足夠好,效率足夠高,還是儘可能保證效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章