您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++核心技術知識有哪些”,在日常操作中,相信很多人在C++核心技術知識有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++核心技術知識有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1. 自動類型推導 auto & decltype()
關于類型可能很多同學會覺得這個話題比較簡單,因為這基本是所有語言的基礎,C/C++、Java等等這些靜態類型語言...,基本都放在第一章節講解,而且很多語言是相通的,但是C++有一個比較強大的關鍵字auto,我覺得有必要強調一下。其實,我們可以根據這個詞的意思差不多猜出這個關鍵字的功能 —— 自動類型推導。也就是說如果一個變量的類型是auto時,它會根據變量的值自動推導出類型。那么,可能就會有朋友產生疑問了:變量是什么類型不是很容易看出來嗎?感覺沒什么用處。也許在C語言或Java中,確實,變量的類型清晰可見,但是C++就不一樣了。例如,
template<class T, class U>auto add(T t, U u) { return t + u; }
C++中有模板的概念,代碼中所示模板就是實現兩個對象t和u的加法,當我們調用add函數時,由于使用了auto關鍵字,返回值類型會自動推導,即為t+u結果類型,如下:
auto b = add(2, 5); //這里的b是int型auto c = add(2.3, 8); //這里的c是float型
到這里,可能又有朋友說,這也沒什么呀,我還是能一眼看出結果的類型,但是這里因為有了auto,才更加體現了C++模板的優勢,定義一次函數,就可以進行多種類型數據的運算處理,并可以返回不同類型的結果,實現代碼的復用。那么,除了這種比較簡單的情況,還有沒有比較復雜的類型?下面接著看:
vector<vector<Dtype> > pred_boxes;for (auto pred_box = pred_boxes.begin(); pred_box != pred_boxes.end(); pred_box++){ pred_box->push_back(batch_id);}
這是我從caffe框架中截取的一段代碼,先不管其含義,僅僅關注auto的用法。這里是實現一個遍歷的功能,將batch_id存到pred_box中。我們定義了一個迭代器pred_box,這里由于auto會自動推導其類型,我們幾乎什么都不用管。但是實際上它的類型是什么樣的呢?請看:
vector<vector<Dtype> >::iterator pred_box;
就是上面的代碼中所寫,是不是覺得繁瑣了很多。說到遍歷,我們也可以將上面的代碼這樣簡化:
vector<vector<Dtype> > pred_boxes;for (auto pred_box :pred_boxes){ pred_box->push_back(batch_id);}
世界又清凈了一些!
說完auto,C++中還有一個與自動類型獲取有關的關鍵字 —— decltype。
那么這二者有什么區別呢?auto關鍵字根據表達式的值推導其類型,可以假想為auto變成了這個類型(實際上不是)。在這個過程中表達式是會被計算的,但是有時候我們并不想表達式被計算,但是仍然希望得到表達式值的類型,這就用到了decltype,用法就是decltype(表達式),舉個栗子:
decltype(pred_boxes) pred_boxes1;
我們定義一個和pred_boxes類型的相同的變量pred_boxes1
同樣,對于下面的表達式:
int &k = 1;decltype(k) j = 1;
j的類型就是int引用類型了。
2. 常量限定符const與 constexpr
講完了自動類型推導,接下來說一下C++中與常量定義相關的兩個關鍵詞 const 和 constexpr。
首先它們都是限定符,起到對變量進行限定的作用,當我們不希望一個變量的值被修改時,我們就需要用const進行限定。比如我們希望固定一個緩沖區的大小:
const int bufferSize = 1024;
那么,這里bufferSize便為不可修改變量,這里的用法與在C中一樣,下面講一下const在C++中的用法。
(1)const的用法
const與引用一起使用
在C++中const會經常與引用一起使用,如下:
const int i = 512;const int &j = i;
這里i與j都是常量,i是整型常量,就是整型引用常量(指向常量的引用),而且需要注意一點,const常量只能作為const常量的值(有點拗口!)
舉個例子:
這里j是一個指向常量的引用,它也可以作為一個值,初始化另一個常量如下
const int &k = j;
這里k如果是一個引用的話必須為常量,如果不是引用的話,可是是一個變量。如下:
int k = j;
可能有的朋友會有些疑惑,既然
int &k = j;
不可以,為什么去掉&就可以了呢?簡單解釋一下,其實引用并不是一個實體對象,而是代表了一種綁定關系。
對于
int &k = j;
來說,其含義是將k綁定到j, 雖然k和j名字不同,但是在硬件上,它們占用同一塊內存,既然j是常量,那么k必然是常量,而
int k = j;
就不一樣了
const與指針一起使用
除了與引用在一起鬼混,const還常常喜歡與指針一起玩耍。這里先簡單說一下引用和指針的區別,雖然很簡單,但是我覺得還是有必要略講一下。上面談到引用其實并不是一個實體對象,即不像整型變量、結構體、枚舉等等這些變量獨自占據內存空間,引用表示了一種綁定關系,將一個別名綁定到一塊內存空間(所以定義引用變量時必須要初始化)。但是指針就不同了,本質上,指針是一塊存儲內存地址的變量,它有一塊內存空間存儲地址信息。那么const與指針一起使用,又會發生什么有意思的事呢?一起來看幾個例子:
const double pi = 3.14;const double *ptr = π
ptr是一個指向const double類型的指針,所以其值必須為const double類型的地址,這里只需要保證指針指向的值不變即可,至于ptr中存的值(地址)是可以改變的,也就是說這里的const限定了指針指向的內存存的值,即上面pi不可改變。
上面說過,指針本身也是一個實體對象,不像引用徒有虛名。所以有一個叫常量指針的(const pointer)家伙。既然叫常量指針,const限定的是指針本身,這就意味著指針中的值不可改變,舉個例子:
double pi = 3.14;double * const ptr = π
ptr中的值在其生命周期中永遠指向&pi, 此時pi可以隨意改變,但是ptr中存的地址是固定的。
那么將這兩者結合起來就可以得到
const double pi = 3.14;const double * const ptr = π
這樣ptr無論指向的值還是其本身都是不可以改變的。
const與類的成員函數一起使用
const除了與“變量”一起使用外,在C++中還會與類的成員函數一起用。這個涉及到類與對象相關的知識,還有成員函數,成員變量,展開講的話會比較多,后面與類和對象放一起說。
(2)constexpr的用法
上面我們講了講const的用法,下面就簡單說下constexpr。constexpr作為限定詞在含義上與const并不相同,constexpr是為了在初始化一個變量時,讓編譯器判斷這個變量的值是否是一個常量或常量表達式,如果該變量用constexpr限定,但是初始化值并不是一個常量或者常量表達式,編譯器便會報錯,(因為我們在定義常量時并不確定右邊的表達式是否是常量表達式),這樣看來還是難于解釋,下面就用幾個例子解釋一下:
constexpr int a = k +1;constexpr int b = newfun();
在這兩個例子中,編譯器在編譯時會檢查k+1和newfun()是否是常量表達式(函數),如果不是,上面的定義就不成立,編譯會失敗。
常量表達式一個重要的特點就是在編譯階段已經確定,下面這個就不是常量表達式:
const int b = newfunc();
因為,這里newfunc()在程序運行的時候才知道結果,在編譯階段因為沒有用constexpr限定,編譯器并不會檢查newfunc()
前面我們說了指針和引用,這里constexpr也是可以和它們一起使用的,但是限制地比較嚴格。以下用指針舉例:
const int *i = nullptr;constexpr int *i = nullptr;
第一個i表示指向int常量的指針
第二個表示指向int的常量指針
3. 空指針NULL與nullptr
下面說一下C++中的空指針。熟悉C的朋友對空指針非常熟悉,NULL。對,C++中仍然有這個關鍵字,不信可以看上面的關鍵字表。但是,在標準C++不建議使用NILL,因為NULL是整數0的宏定義。我們經常使用空指針來初始化一個指針變量,試想一下如果用一個整數作為指針變量的值,總是有些不妥,盡管編譯器不會報錯。所以C++11標準推薦我們使用nullptr,這個關鍵字本身就是代表空指針,更加合適,所以下次如果你們在C++中初始化一個指針變量時,就用名副其實的nullptr吧。
到此,關于“C++核心技術知識有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。