C++?auto關鍵字的小知識點分享
前言
今天我們學習一些關于C++的一些小知識點,碼字不易,希望多多支持
auto關鍵字(C++11)
1.類型別名思考
隨著程序越來越復雜,程序中用到的類型也越來越復雜,經常體現在:
- 類型難于拼寫
- 含義不明確導致容易出錯
就比如下面這段代碼:
#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(); while (it != m.end()) { //.... } return 0; }
std::map<std::string, std::string>::iterator是一個類型,但是該類型太長了,特別容易寫錯。聰明的同學可能已經想到:可以通過typedef給類型取別名,比如:
使用typedef取別名
#include <string> #include <map> typedef std::map<std::string, std::string> Map; int main() { Map m{ { "apple", "蘋果" },{ "orange", "橙子" }, {"pear","梨"} }; Map::iterator it = m.begin(); while (it != m.end()) { //.... } return 0; }
但是:使用typedef給類型取別名確實可以簡化代碼,但是typedef有會遇到新的難題:
使用typedef
來為類型取別名可以提高代碼的可讀性和可維護性,但在某些情況下,過度使用或不恰當使用typedef
可能會導致代碼變得復雜、難以理解或難以調試。以下是一個關于使用typedef
取類型別名的不好之處的例子:
typedef int* IntPtr; void foo(IntPtr ptr) { // 一些代碼邏輯 } int main() { int num = 5; IntPtr ptr = # foo(ptr); return 0; }
在上述示例中,typedef
被用于將int*
類型定義為IntPtr
類型的別名。然而,這種命名方式可能會產生誤導,讓人誤以為IntPtr
是一個指向整型的指針,而不是一個整型指針。這種混淆可能導致代碼閱讀和調試時的困惑。
此外,使用typedef
的過度使用可能導致代碼中出現大量的類型別名,使得代碼變得難以理解。例如,當存在多個具有不同功能的指針類型時,使用過多的typedef
可能會使代碼變得混亂,增加了理解和維護的難度。
綜上所述,不當或過度使用typedef
可能會使代碼變得復雜,難以理解和難以調試,從而影響代碼的可讀性和可維護性。因此,在使用typedef
時需要慎重考慮,并確保起到提高代碼可讀性的作用,而不是增加代碼的復雜性。
2.auto簡介
1.在早期C/C++中auto的含義是:使用 auto修飾的變量,是具有自動存儲器的局部變量 ,但遺憾的是一直沒有人去使用它,大家可思考下為什么?
2.C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。 舉例:
#include<iostream> using namespace std; int TestAuto() { return 10; } int main() { int a = 10; auto b = a; auto c = 'a'; auto d = TestAuto(); cout << typeid(b).name() << endl; cout << typeid(c).name() << endl; cout << typeid(d).name() << endl; //auto e; 無法通過編譯,使用auto定義變量時必須對其進行初始化 return 0; }
注意
使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為變量實際的類型。
3.auto的使用細則
auto與指針和引用結合起來使用
用auto聲明指針類型時,用auto和auto沒有任何區(qū)別,但用auto聲明引用類型時則必須加&
#include<iostream> using namespace std; int main() { int x = 10; auto a = &x; auto* b = &x; 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; }
在同一行定義多個變量
當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量 。
void TestAuto() { auto a = 1, b = 2; auto c = 3, d = 4.0; // 該行代碼會編譯失敗,因為c和d的初始化表達式類型不同 }
4.auto不能推導的場景
auto不能作為函數的參數
// 此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導 void TestAuto(auto a) {}
auto不能直接用來聲明數組
void TestAuto() { int a[] = {1,2,3}; auto b[] = {4,5,6}; }
為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法
auto在實際中最常見的優(yōu)勢用法就是跟以后會講到的C++11提供的新式為循環(huán),還有l(wèi)ambda表達式等進行配合使用。
注意事項
到此這篇關于C++ auto關鍵字的小知識點分享的文章就介紹到這了,更多相關C++ auto關鍵字內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!