也談C 11裡的auto型別

2021-10-01 16:31:21 字數 1479 閱讀 7785

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;因為,複雜的變數也許並不難理解,只是沒有必要完全寫出來;而迭代器最主要的是迭代的功能,而不是具體型別的確定。

案例如下:

listlsttest;

auto it = lst.begin();

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

C 11 型別推導auto

在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。使用auto會拖慢c 效率嗎?完全不會,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。使用auto會拖累c 編譯效率嗎?完全不...

C 11中的auto陷阱

c 11中引入的auto關鍵字自動推導型別特性,可能是最方便也最容易理解的特性了。然而,即使是這個簡單特性,也有陷阱,需要我們使用時注意。1 引用型別被推導為非引用型別 例如 foo void arg 上面的 中big會被推導為mybigclass型別,而不是mybigclass 型別,從而導致拷貝...

c 11新特性之auto

在早期版本中,auto關鍵字用來宣告具有自動儲存器的區域性變數,auto關鍵字很少被使用,除了靜態變數之外,其它的變數預設是auto的。因此,在c 11中,刪除了原有的功能,並對其重新設計,增加了auto的型別推導功能。template double add t1 a,t2 b int main i...