C++?auto關(guān)鍵字的小知識(shí)點(diǎn)分享
前言
今天我們學(xué)習(xí)一些關(guān)于C++的一些小知識(shí)點(diǎn),碼字不易,希望多多支持
auto關(guān)鍵字(C++11)
1.類(lèi)型別名思考
隨著程序越來(lái)越復(fù)雜,程序中用到的類(lèi)型也越來(lái)越復(fù)雜,經(jīng)常體現(xiàn)在:
- 類(lèi)型難于拼寫(xiě)
- 含義不明確導(dǎo)致容易出錯(cuò)
就比如下面這段代碼:
#include <string> #include <map> int main() { std::map<std::string, std::string> m{ { "apple", "蘋(píng)果" }, { "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是一個(gè)類(lèi)型,但是該類(lèi)型太長(zhǎng)了,特別容易寫(xiě)錯(cuò)。聰明的同學(xué)可能已經(jīng)想到:可以通過(guò)typedef給類(lèi)型取別名,比如:
使用typedef取別名
#include <string> #include <map> typedef std::map<std::string, std::string> Map; int main() { Map m{ { "apple", "蘋(píng)果" },{ "orange", "橙子" }, {"pear","梨"} }; Map::iterator it = m.begin(); while (it != m.end()) { //.... } return 0; }
但是:使用typedef給類(lèi)型取別名確實(shí)可以簡(jiǎn)化代碼,但是typedef有會(huì)遇到新的難題:
使用typedef
來(lái)為類(lèi)型取別名可以提高代碼的可讀性和可維護(hù)性,但在某些情況下,過(guò)度使用或不恰當(dāng)使用typedef
可能會(huì)導(dǎo)致代碼變得復(fù)雜、難以理解或難以調(diào)試。以下是一個(gè)關(guān)于使用typedef
取類(lèi)型別名的不好之處的例子:
typedef int* IntPtr; void foo(IntPtr ptr) { // 一些代碼邏輯 } int main() { int num = 5; IntPtr ptr = # foo(ptr); return 0; }
在上述示例中,typedef
被用于將int*
類(lèi)型定義為IntPtr
類(lèi)型的別名。然而,這種命名方式可能會(huì)產(chǎn)生誤導(dǎo),讓人誤以為IntPtr
是一個(gè)指向整型的指針,而不是一個(gè)整型指針。這種混淆可能導(dǎo)致代碼閱讀和調(diào)試時(shí)的困惑。
此外,使用typedef
的過(guò)度使用可能導(dǎo)致代碼中出現(xiàn)大量的類(lèi)型別名,使得代碼變得難以理解。例如,當(dāng)存在多個(gè)具有不同功能的指針類(lèi)型時(shí),使用過(guò)多的typedef
可能會(huì)使代碼變得混亂,增加了理解和維護(hù)的難度。
綜上所述,不當(dāng)或過(guò)度使用typedef
可能會(huì)使代碼變得復(fù)雜,難以理解和難以調(diào)試,從而影響代碼的可讀性和可維護(hù)性。因此,在使用typedef
時(shí)需要慎重考慮,并確保起到提高代碼可讀性的作用,而不是增加代碼的復(fù)雜性。
2.auto簡(jiǎn)介
1.在早期C/C++中auto的含義是:使用 auto修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量 ,但遺憾的是一直沒(méi)有人去使用它,大家可思考下為什么?
2.C++11中,標(biāo)準(zhǔn)委員會(huì)賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類(lèi)型指示符,而是作為一個(gè)新的類(lèi)型指示符來(lái)指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得。 舉例:
#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; 無(wú)法通過(guò)編譯,使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化 return 0; }
注意
使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來(lái)推導(dǎo)auto的實(shí)際類(lèi)型。因此auto并非是一種“類(lèi)型”的聲明,而是一個(gè)類(lèi)型聲明時(shí)的“占位符”,編譯器在編譯期會(huì)將auto替換為變量實(shí)際的類(lèi)型。
3.auto的使用細(xì)則
auto與指針和引用結(jié)合起來(lái)使用
用auto聲明指針類(lèi)型時(shí),用auto和auto沒(méi)有任何區(qū)別,但用auto聲明引用類(lèi)型時(shí)則必須加&
#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; }
在同一行定義多個(gè)變量
當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是相同的類(lèi)型,否則編譯器將會(huì)報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對(duì)第一個(gè)類(lèi)型進(jìn)行推導(dǎo),然后用推導(dǎo)出來(lái)的類(lèi)型定義其他變量 。
void TestAuto() { auto a = 1, b = 2; auto c = 3, d = 4.0; // 該行代碼會(huì)編譯失敗,因?yàn)閏和d的初始化表達(dá)式類(lèi)型不同 }
4.auto不能推導(dǎo)的場(chǎng)景
auto不能作為函數(shù)的參數(shù)
// 此處代碼編譯失敗,auto不能作為形參類(lèi)型,因?yàn)榫幾g器無(wú)法對(duì)a的實(shí)際類(lèi)型進(jìn)行推導(dǎo) void TestAuto(auto a) {}
auto不能直接用來(lái)聲明數(shù)組
void TestAuto() { int a[] = {1,2,3}; auto b[] = {4,5,6}; }
為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類(lèi)型指示符的用法
auto在實(shí)際中最常見(jiàn)的優(yōu)勢(shì)用法就是跟以后會(huì)講到的C++11提供的新式為循環(huán),還有l(wèi)ambda表達(dá)式等進(jìn)行配合使用。
注意事項(xiàng)
到此這篇關(guān)于C++ auto關(guān)鍵字的小知識(shí)點(diǎn)分享的文章就介紹到這了,更多相關(guān)C++ auto關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++用boost.signal實(shí)現(xiàn)多播委托
這篇文章介紹了C++用boost.signal實(shí)現(xiàn)多播委托的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C語(yǔ)言?xún)?nèi)存函數(shù)的具體使用
本文介紹了C語(yǔ)言中幾個(gè)常用的內(nèi)存函數(shù),包括memcpy、memmove、memset、memcmp的使用方法及其模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11C語(yǔ)言詳細(xì)分析講解struct與union使用方法
最近開(kāi)始自學(xué)C語(yǔ)言,從最基礎(chǔ)部分的開(kāi)始學(xué)起。今天看書(shū)的時(shí)候注意到了struct和union似乎很像,除了名字不同,看起來(lái)幾乎沒(méi)有區(qū)別。<BR>既然C中定義了struct和union兩個(gè)關(guān)鍵字,那么它們肯定是有區(qū)別的,在查了一些資料之后我來(lái)總結(jié)一下他們的使用2022-04-04C++結(jié)構(gòu)體中變長(zhǎng)數(shù)組的使用問(wèn)題分解刨析
變長(zhǎng)數(shù)組在C++中指的是集合(也叫容器)如vector就是C語(yǔ)言中,所有的數(shù)組都不定長(zhǎng),沒(méi)有下標(biāo)越界的概念,數(shù)組實(shí)質(zhì)就是一個(gè)指針(由數(shù)組名充當(dāng))因此C語(yǔ)言中數(shù)組的長(zhǎng)度沒(méi)有任何意義平常在C語(yǔ)言中講的不定長(zhǎng)數(shù)組,其實(shí)就是指針2022-08-08C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素
vector是一種動(dòng)態(tài)數(shù)組,本文主要介紹了C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07舉例分析private的作用(c/c++學(xué)習(xí))
我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來(lái),但是還是搞不懂private該怎么用,或者說(shuō)在一個(gè)具體程序中,private有什么用2020-08-08