1.隱形刺客:auto
描述:這個這個關鍵字用於聲明變量的生存期為自動,即將不在任何類、結構、枚舉、聯合和函數中定義的變量視為全局變量,而在函數中定義的變量視為局部變量。auto關鍵字在我們寫的代碼里幾乎看不到,但是它又無處不在,它是如此的重要,又是如此的與世無爭,默默的履行着自己的義務,卻又隱姓埋名。

作用:C程序是面向過程的,在C代碼中會出現大量的函數模塊,每個函數都有其生命周期(也稱作用域),在函數生命周期中聲明的變量通常叫做局部變量,也叫自動變量。例如:
int fun(){
int a = 10; // auto int a = 10;
// do something
return 0;
}
int fun(){
int a = 10; // auto int a = 10;
// do something
return 0;
}
整型變量a在fun函數內聲明,其作用域為fun函數內,出來fun函數,不能被引用,a變量為自動變量。也就是說編譯器會有int a = 10之前會加上auto的關鍵字。
auto的出現意味着,當前變量的作用域為當前函數或代碼段的局部變量,意味着當前變量會在內存棧上進行分配。

2.C++98auto
早在C++98標准中就存在了auto關鍵字,那時候的作用是讓變量變成自動變量,擁有自動的生命周期,但是臨時變量在聲明的時候本身就是自動生命周期了,所以這顯得很多余。
int a =10 ; //擁有自動生命期
auto int b = 20 ;//擁有自動生命期
static int c = 30 ;//延長了生命期
取而代之,C++11就刪除了原來的用法,改為了自動推導變量類型。auto 關鍵字可以用於變量類型的推斷,我們可以在聲明變量的時候根據變量初始值的類型自動為該變量選擇合適的類型,而不需要我們顯式指定類型。

3.使用auto進行類型推斷
(1)普通類型的推斷
auto x = 127; // auto 被推斷為 int 類型
auto y = 3.14; // auto 被推斷為 double 類型
auto z; // 錯誤,必須有初始值才能進行推斷
(2)引用類型推斷
int x = 0, &rx = x;
auto a1 = rx; // 使用引用其實是使用引用的對象,此時 auto 以引用對象的類型作為 auto 的類型,所以 auto 這里被推斷為 int
auto &a2 = rx; // 此時 auto 被推斷為 int 類型,a2 對象本身就是 int & 類型
const auto &a3 = rx; // auto 被推斷為 int 類型,a3 對象本身是 const int & 類型,不能通過 a3 去修改 rx 引用的對象值
(3)const類型的推斷
const int c = 10;
auto a1 = c; // auto 此時是 int,頂層 const 屬性被丟棄
auto &a2 = c; // auto 此時是 const int,底層 const 屬性保留
(4)針對數組和函數的推斷
const char arr[] = "I Love China";
auto r1 = arr; // 如果將數組名賦值給 auto 變量,那么 auto 推斷的結果是指針類型,如果有 const 屬性
// 會被保留,auto 推斷的結果是 const char *,r1 為 const char *
auto &r2 = arr; // 如果將數組名賦值給 auto & 變量,auto & 變量的類型是一個數組引用類型,即為
// const char (&) [14]
int add(int a,int b); // 函數聲明
auto r3 = add; // r3 為 int(*)(int, int)
auto &r4 = add; // r4 為 int(&)(int, int)
推斷規則說明
① 對於普通類型推斷(沒有 const 也不摻雜引用的),直接根據表達式右邊值的類型進行推斷,注意必須有初始值
② 使用引用進行推斷,實際上就是使用引用對象的類型進行推斷,此時引用特性會被丟棄,如果定義的對象需要成為引用,就自己在 auto 后面加上 & 來定義對象
③ 使用帶有 const 屬性的對象進行推斷時,如果定義的對象不是指針或者引用,則 const 屬性會被丟棄,否則 const 屬性會保留,見 (3) const 類型的推斷
auto關鍵字說明
auto 自動類型推斷發生在編譯期,所以使用 auto 關鍵字不會降低程序的運行效率。

4.auto關鍵字使用的場景
適用的場景
(1) 一些類型長度書寫很長的,可以使用 auto 來簡化,如 for(std::vector<int>::iterator it = v.begin();it != v.end();++it),如果使用 auto 可以直接寫為 for(auto it = v.begin();it != v.end();++it)
(2) 當函數返回的值不確定時,可以使用 auto 做返回值類型,更加方便,編譯器會根據返回值的類型推斷 auto 的類型,這種語法是在 C++14 才出現的。
auto func() // 這種寫法在 C++14 是允許的
{
return 0;
}
不適用的場景
(1) 函數參數類型不能是 auto 類型,比如 int add(auto a, auto b) { return a + b; } 是不允許的
(2) 類的成員變量不可以是 auto 類型。類的靜態成員變量可以是 auto 類型的,但是需要使用 const 修飾,而且該變量的值在類內初始化
文章來源:https://blog.csdn.net/weixin_38102771/article/details/90576389?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-2&spm=1001.2101.3001.4242

如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!
【C語言C++學習企鵝圈子】,分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習書籍:

編程學習視頻:
