C 之auto關鍵字

2021-07-23 15:08:23 字數 2505 閱讀 3369

【在那些情況下要申明型別】

定義變數型別

函式返回值,函式引數

表示式返回變數型別

【為什麼auto】

在開發實踐中,有時候我們並不能非常容易地確定乙個變數應該具有的資料型別。比如,將某個複雜表示式作為初始值賦值給乙個新定義的變數時,我們往往很難確定這個表示式的資料型別,從而無法確定變數應有的資料型別。為了解決這個問題,

c++11為我們提供了auto關鍵字,使用它作為某個變數定義的資料型別,編譯器會根據這個變數的初始值,自動推斷出這個變數合理的資料型別而無需我們人為指定。

【auto概念詳解】

auto關鍵字——根據初始值推斷真實的資料型別。

auto儲存型別說明

auto儲存型別說明符宣告了乙個自動變數,auto物件和變數被儲存在棧中,它的生命週期僅存在於它的宣告所在的塊(block)中,即乙個只在塊執行時有效的變數。乙個auto變數僅在宣告它的塊內是可見的。auto物件和變數對外部模組都是不可見的。auto變數的宣告能包含初始化。因為有auto儲存型別的變數並不自動的初始化,應該在宣告時顯式的初始化它們,或在同乙個塊內賦給它們初始值。未初始化的auto變數的值是未定義的。

【auto關鍵字原理】

在定義變數的時候必須申明型別,c++是強語言型別,在編譯階段需要知道型別,這樣的好處是程式效率更高,而動態語言不需要型別申明的需要自推導變數型別。使用了auto是不是c++效率會變慢?完全不是,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。前提條件是編譯器可以根據當前的程式的狀態推導出變數型別。只是編譯器更加智慧型,我猜想編譯時間豈不更長了。

【auto關鍵字使用場景】

場景一,申明普通變數

auto num =10;

場景二,函式返回值如果沒有auto,總是要巧那麼長的返回值,有了auto關鍵字後,是不是心裡感覺很爽。

vector str_vec;

vector::iterator it_old = str_vec.begin();

auto it_new = str_vec.begin();

場景三,申明函式返回值

auto add(int a, int b)->int

【auto**使用示例】auto x = 7; // 使用整數7對變數x進行初始化,x被推斷為int型別

auto y = 1.982; // 使用浮點數1.982對變數y進行初始化,y被推斷為double型別

handler gethandler(); // 使用gethandler()函式的返回值對變數handler進行初始化

auto handler = gethandler();// handler被推斷為handler型別

這裡我們在定義變數x的時候,並沒有指定其具體的資料型別,而是使用auto做為代替。這樣,編譯器在編譯這段**時,會根據7這個初始值自動推斷x的實際資料型別為int。同樣的道理,使用浮點數1.982進行初始化的變數y會被編譯器自動推斷為double型別;而最後的乙個變數handler會被初始化為gethandler()函式的返回值型別handler。雖然auto關鍵字會根據初始值自動推斷變數的資料型別,但是,它的使用並不需要花費額外的編譯時間。

實際上,可以把auto關鍵字看成是乙個變數定義中的資料型別佔位符,它佔據了原來應該是具體資料型別的位置。而在編譯的時候,編譯器會根據這個變數的初始值,推斷出這個變數應有的具體資料型別,然後替換掉auto關鍵字,就成為乙個普通的帶有具體資料型別的變數定義了。用auto關鍵字定義變數的形式跟一般的定義變數的形式並無二異,唯一的差別之處在於,用auto關鍵字定義變數時,變數必須有初始值:

auto 變數名 = 初始值表示式; // 賦值形式 // 或 auto 變數名; // 初始化列表形式這樣,這個初始值表示式計算結果的資料型別將被編譯器推斷為變數的資料型別。

auto使用需要注意的幾個問題

1、使用auto關鍵字的變數必須有初始值,編譯器才能推導出變數型別。

2、在傳遞const變數的時候,使用auto必須自己加const

const int a =10;

auto b = a; // b的型別是int

const auto c = a; // c 的型別是const int

3、關於很奇葩的函式返回值

auto關鍵字只能在函式的返回值使用auto關鍵字,並且在函式尾還需要標註返回型別

這樣看起來很奇葩,莫不如不用auto關鍵字,但我認為委員會的人沒這麼閒,上google查了下,有下面兩條原因:

1、他們認為把返回值放在函式後面更好看(特別是返回值很長的時候)

2、c++14將會把討人煩得返回值去掉,編譯器直接支援自推導。

auto關鍵字 decltype關鍵字

自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...

C 的auto關鍵字

c中的auto關鍵字沒啥大用,因為它是用於顯式地說明變數是自動儲存型別的,但是auto又只能用於預設就是自動儲存的區域性變數,即函式中定義的變數和函式的引數,所以 emmmm,很尷尬的工作,大家根本不鳥他。比如 intft int x c 看出了auto的尷尬,於是需要有新工作的時候就沒有引入新的關...

C 中,auto 關鍵字

在函式返回值 range for 等情況中 1 auto使用有5種用法 auto 拷貝 auto 左值引用,只能接左值 和常量右值 auto 萬能引用,能接左值和右值 const auto const 萬能引用,能接左值和右值 const auto 常量右值引用,只能接右值 很多人直接就寫成 aut...