c 學習筆記十九 關於auto

2021-10-04 04:18:23 字數 1337 閱讀 5313

在早期c/c++中auto的含義是:使用auto修飾的變數,是具有自動儲存器的區域性變數。

c++11中,auto有了全新的含義即:auto不再是乙個儲存型別指示符,而是作為乙個新的型別

指示符來指示編譯器,auto宣告的變數必須由編譯器在編譯時期推導而得。

通俗地講,auto關鍵字是可以自動推導變數型別的。

需要注意的是,auto不是乙個型別的「宣告」,而是乙個「佔位符」,編譯器在編譯期會將auto替換為變數實際的型別。使用auto定義變數時必須對其進行初始化,在編譯階段編譯器需要根據初始化表示式來推導auto的實際型別。它自動推導變數型別是根據「=」右側的變數型別決定的。

int testauto()

int main()

可以使用的場景:

1. auto與指標和引用結合起來使用

用auto宣告指標型別時,用auto和auto*沒有任何區別,但用auto宣告引用型別時則必須加&

int main()

2. 在同一行定義多個變數

當在同一行宣告多個變數時,這些變數必須是相同的型別,否則編譯器將會報錯,因為編譯器實際只對

第乙個型別進行推導,然後用推導出來的型別定義其他變數。

void testauto()

3.auto在實際中最常見的優勢用法是c++11提供的新式for迴圈,還有lambda表示式等進行配合使用。
vector::iterator it;

for(auto p:it){}; //拷貝乙份副本

for(auto &p:it){}; //操作變數本身

不可以使用的場景:

1. auto不能作為函式的引數

引數要被編譯成指令,但是開闢空間時候需要知道空間大小,auto做引數不知道多大,那麼棧幀也不知道開多大。

void testauto(auto a){}		//auto不能作為形參型別,因為編譯器無法對a的實際型別進行推導
2. auto不能直接用來宣告陣列
void testauto()

; auto b[3] = a; //因為陣列也涉及大小,a的型別嚴格來說是 int [3],所以b的大小也不確定。

}

3. 例項化模板時不能使用auto作為模板引數

4.auto不能定義類的非靜態成員變數

5.為了避免與c++98中的auto發生混淆,c++11只保留了auto作為型別指示符的用法

C 學習筆記(三) auto的用法

1 auto變數必須在定義時初始化 auto a1 10 正確 auto b1 錯誤,編譯器無法推導b1的型別 b1 10 2 定義在乙個auto序列的變數必須始終推導成同一型別 auto a4 10,a5 正確 auto b4,b5 20.0 錯誤,沒有推導為同一型別3 初始化表示式為陣列時,au...

C 學習筆記十九 API函式的實踐

我這次就寫了乙個取程序id,獲取程序的pid 這裡用到了幾個api函式,實現了取程序id 這樣就實現乙個功能,其實這是我去參考易語言超級模組翻譯過來的 寫的樣子和易語言的也幾乎一樣,軟體功能都是靠api實現的 需要什麼api功能區參考一下那些模組,翻譯過來很有價值 乙個軟體都是靠很多的api實現,我...

Swift學習筆記 十九 屬性

屬性將值與特定的類 結構體或列舉關聯。儲存屬性會將常 和變 儲存為實 的一部分,計算屬性則是直接計算 而 是存 儲 值。計算屬性可以用於類 結構體和列舉,儲存屬性只能用於類和結構體。儲存屬性和計算屬性通常與特定型別的實 關聯。但是,屬性也可以直接與型別本身關聯,這種屬性稱為型別屬性。另外,還可以定義...