前言
C語言中包括了關(guān)鍵字auto,它可用于定義局部變量。但自從所有的非全局變量的缺省值假定為auto以來,auto就幾乎很少使用了。 在C或者以前C++中,auto關(guān)鍵字基本上可以被無視.
但是在C++11中auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。
一、C語言中的auto
在C語言的學習中我們幾乎用不到auto
關(guān)鍵字,它的存在感實在是太低了?。?!
即便如此,我們還是為了C++中的auto
的學習先復習一下C語言中的auto
關(guān)鍵字吧。
1、C語言中,auto用于聲明一個變量為自動變量
自動變量也稱局部變量。auto關(guān)鍵字主要用于聲明變量的生存期為自動,即將不在任何類、結(jié)構(gòu)、枚舉、聯(lián)合和函數(shù)中定義的變量視為全局變量,而在函數(shù)中定義的變量視為局部變量。這個關(guān)鍵字經(jīng)常被省略,因為所有的局部變量默認就是auto的。
- 用auto聲明全局變量時,編譯出錯:
#include<stdio.h>
auto int i=0; //編譯出錯
int main()
{
return 0;
}
- auto聲明局部變量時,編譯正常:
#include<stdio.h>
int main()
{
auto int i=0;
return 0;
}
2、C語言中,只使用auto修飾變量,變量的類型默認為整型
void main(void)
{
float a = 3.2f, b = 2.1f;
auto c = a + b;//c語言中,c = 5
}
二、C++中的auto
1、auto的基本介紹
在C++11中,auto是用來自動推導表達式或變量的實際類型的。
例如:
#include<iostream>
using namespace std;
int main()
{
int a = 0;
auto b = a;//此時b為int 類型
cout << typeid(a).name() << endl;//typeid().name()可以自動識別變量的類型
cout << typeid(b).name() << endl;
return 0;
}
可能你會覺得auto的這點功能好像可有可無啊,但其實隨著程序越來越復雜,程序中用到的類型也越來越復雜,經(jīng)常體現(xiàn)在:
- 類型難于拼寫
- 含義不明確導致容易出錯
例如這樣長的的變量類型std::map<std::string, std::string>::iterator
我們完全可以使用一個auto
來進行代替
下面的代碼可能你看不懂,但是你只需要理解這里auto
的作用就行了。
#include <string>
#include <map>
int main()
{
std::map<std::string, std::string> m{ { "apple", "蘋果" }, { "orange",
"橙子" },{"pear","梨"} };
std::map<std::string, std::string>::iterator it = m.begin();
//auto it = m.begin();//與上一行代碼作用相同,只是auto更加方便
return 0;
}
可能你會覺得C語言中的typedef
關(guān)鍵字也能做到同樣的簡化代碼的效果,但是使用typedef有時會遇到新的難題。
例如:
typedef char* pstring;
int main()
{
const pstring p1; // 編譯成功還是失???
const pstring* p2; // 編譯成功還是失???
return 0;
}
答案是第一個編譯失敗,第二個編譯成功。
- 第一個實際類型是:
char*const p1;
const
修飾的是p1,p1是一個常變量,常變量的創(chuàng)建必須初始化,而且只能初始化一次,而上面的代碼并沒有進行初始化,因此報錯。
- 第二個的實際類型是:
char*const* p2;
const
修飾的是*p2,沒有問題。
通過上面的對比相信你也能體會到auto
的作用了吧,在編程時,常常需要把表達式的值賦值給變量,這就要求在聲明變量的時候清楚地知道表達式的類型。然而有時候要做到這點并非那么容易,auto的出現(xiàn)就解決了這個問題。
2、auto的使用細則
1.使用auto定義變量時必須對其進行初始化
#include<iostream>
using namespace std;
int TestAuto()
{
return 10;
}
int main()
{
int a = 10;
auto b = a;//變量
auto c = 'a';//字符
auto d = TestAuto();//函數(shù)返回值
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
//auto e; 無法通過編譯,使用auto定義變量時必須對其進行初始化
return 0;
}
使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據(jù)初始化表達式來推導auto的實際類型。因此auto并非是一種"類型"的聲明,而是一個類型聲明時的"占位符”,編譯器在編譯期會將auto替換為變量實際的類型。
2.auto與指針和引用結(jié)合起來使用
用auto聲明指針類型時,用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時則必須加&
#include<iostream>
using namespace std;
int main()
{
int x = 10;
auto a = &x;
auto* b = &x;//使用auto*時,表達式右邊必須是指針,否則報錯
auto& c = x;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
*a = 20;
*b = 30;
c = 40;
return 0;
}
3. 在同一行定義多個變量
當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量。文章來源:http://www.zghlxwxcb.cn/news/detail-712652.html
void TestAuto()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 該行代碼會編譯失敗,因為c和d的初始化表達式類型不同
}
3、auto不能推導的場景
1.auto不能作為函數(shù)的參數(shù)
// 此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導
void TestAuto(auto a)
{
}
2.auto不能直接用來聲明數(shù)組
void TestAuto()
{
int a[] = {1,2,3};
auto b[] = {4,5,6};//報錯
}
tip:為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法文章來源地址http://www.zghlxwxcb.cn/news/detail-712652.html
到了這里,關(guān)于【C++】C++入門 auto關(guān)鍵字詳解(C++11)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!