以字符串這種支持
for (declaration : expression)
statement
這樣for
語句迭代的數據結構爲例,我們看看auto
關鍵字在類型推斷中的作用。
string s = "I LOVE YOU!";
for (char ch : s){
cout << ch << endl;
}
輸出:
I LOVE YOU!
這種情況下用不用auto
都無所謂,因爲這時候auto
並不能減少代碼量,但是一到複雜的循環時就可以體現出來了,因此最好還是用auto
。
像上面那樣對string進行遍歷並不能改變其本身,ch
是s
中每個字符的副本拷貝。想要改變s
本身,則要限定參與遍歷的是引用:
for (auto &ch : s) {
ch = tolower(ch);
cout << ch << endl;
}
輸出:
i love you!
這樣ch
是s
中每個字符的引用,對ch
進行修改也就可以修改s
本身了。
for-each
這樣的語法應用於多維數組時,需要注意的是外層循環要使用引用:
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
for (auto &row : array){
for (auto col : row)
cout << col << " ";
cout << endl;
}
如果row
不是引用,那麼它會被自動轉化爲對這個二維數組每一行的指針,成爲了指針,內層循環對指針進行遍歷就當然不合法了。
下面就auto
比較特殊的一點來舉個栗子:
int foo = 11;
const int &a = 10;
int *p = &foo;
auto x = foo;//x是int
auto y = a;//y是int,int類型的變量y當然可以用引用a來初始化,這裏a的頂層const屬性被移除。
auto &yy = a;//yy是const int &,所以可以用a來對yy進行初始化。
auto pp = p;//這個與下面一樣,我暫時還不能搞懂
auto *ppp = p;//ppp是int *,可以用p賦值初始化
cout << y << endl;
cout << yy << endl;
cout << pp << endl;
cout << ppp << endl;
結果:
10
10
0x61fefc
0x61fefc
發現沒有,pp
與ppp
是一樣的,這裏涉及到auto
的一些原理,我不是太清楚。而且auto
定義的是引用時,初始化值頂層的const
屬性並不會移除,yy
是個例子;auto
定義的不是引用時,初始化值頂層的const
屬性會被移除,y
就是個例子。