《C++ Primer 第五版》第二章(第5小節)——using和typedef,auto和decltype總結

1.using和typedef(作用:定義類型別名)

? ? ? ? 1)typedef和using都可以用來定義一個類型別名,二者在類型別名上定義沒有區別。只是需要注意的是類型和類型別名的順序,使用typedef定義類型別名的結構為 typedef 類型 類型別名;使用using定義類型別名的結構為using 類型別名=類型

? ? ? ? 2)但在定義類型模板的情況下,只能使用using。

? ? ? ? typedef的四大用途和兩大陷阱(參考博客:https://blog.csdn.net/ameyume/article/details/6326278#commentsedit):博主介紹的特別詳細。

? ? ? ? typedef使用功能強大,主要分為一下四個方面的用途:1)定義一種類型別名,不等同于宏替換,特別是定義復雜結構類型的時候,如typedef char *Pstring; const Pstring mystring;這里定義的是一個常量指針mystring(由于typedef定義類型別名是一個指向char類型的指針,因此加上const之后只是說指針變成了常量指針),如果采用宏替換的話,得到的結果就是mystring是一個指向常量的指針。2)typedef可以幫助C中簡化結構體的定義;沒有使用typedef定義的結構體為:struct student_info{ int age; int ID;};struct student_info zhangsan;使用typedef定義的結構體為:typedef struct student_info{ int age; int ID;}Student_info;?Student_info zhangsan;(這里的Student_info就是 struct student_info的別名,在C++結構體定義對象時可以不用使用typedef,因為C++定義對象不需要寫struct)3)用typedef可以用來定義與平臺無關的類型,標準庫中的size_t就是采用這種方法,在做跨平臺代碼移植的時候,typedef的用途更加明顯,只需要修改typedef本身的類型,而不需要修改源碼)4)使用typedef可以簡化復雜的聲明,簡化的規則是從外到里,逐層使用typedef替換,最后可以得到原聲明的最簡化版本。

? ? ? ?typedef的兩大陷阱在于:1)typedef是定義一個類型別名,分析代碼的時候需要使用類型別名的含義去分析,而不能做類型替換去分析。2)typedef 就像 auto,extern,mutable,static,和 register 一樣,是一個存儲類關鍵字,在定義類型別名的時候,不能同時出現兩個存儲類的關鍵字。

2.auto和decltype(作用:獲取對象或者表達式的類型)

? ? ? ?為了方便在編程中了解某個對象或者表達式的類型,C++11提供了auto和decltype來得到表達式或者對象的類型。在此之前復習一下上一節中所述的頂層const和底層const的概念:1)頂層const:定義的變量本身是一個常量,如常量內置類型數據和常量指針;2)底層const:指針指向的數據或者引用綁定的數據是一個常量,如指針常量和常量引用;

? ? ? ?使用auto類型說明符應注意以下幾個規則:1)auto可以在一條語句中聲明多個變量,但是多個變量的類型必須一致;2)使用auto時,編譯器一般會忽略頂層const,保留底層的const,也就是要分析左側auto的類型,右側的頂層const屬性去掉。3)在2)的基礎上,如果希望保留右側對象的頂層const屬性,只需要在auto前面加上const即可;4)當使用auto來得到引用類型時,如果右側是字面值常量時,需要在auto前面加上const,如 3)中介紹。使用auto類型說明符的結論是采用 1)2)來分析auto的類型,然后再使用句法來分析賦值是否正確。

? ? ? ? 使用decltype類型指示符需要注意一下幾個規則:1)當decltype括號中的是一個變量,則返回的是變量的類型(包含頂層const和引用),可以使用decltype去獲取引用(對象的別名)的類型,這里對于引用來說是個例外;2)當decltype括號中的類型是一個表達式時,則返回的是表達式結果的類型。3)如果括號中的是一個解引用或者給變量加多層括號,則返回的是引用類型(引用類型和解引用的結果或括號中的變量結果相同),因為變量是一種可以作為左值的特殊表達式(只有括號中是變量才是這種情況,否則多個括號情況就按表達式來分析)

? ? ? ?auto和decltype的區別在于:auto是獲取右側數據的類型,并對變量進行賦值操作;而decltype只是為了獲取括號中的表達式的類型,其結果類型和表達式的形式有關。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382277.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

204. 計數質數 golang

一次嘗試,如何擊敗100%用戶(用時,內存) func countPrimes(n int) int {if n 499979 {return 41537}if n 11 {return 4}if n 12 {return 5}if n 13 {return 5}if n 14 {return 6}if n 15 {return 6}if n 10 {return 4}if n …

leetcode內存消耗

leetcode內存消耗最是多少 執行用時 :0 ms, 在所有 Go 提交中擊敗了100.00%的用戶 內存消耗 :1.9 MB, 在所有 Go 提交中擊敗了94.81%的用戶測試鏈接 Test

《C++ Primer 第五版》(第2.5節,第3.1-3.4節) ——采用預處理功能編寫頭文件,string初始化和字符操作,vector初始化和迭代器

1.采用預處理功能編寫頭文件 在頭文件定義(頭文件中的內容是只能被定義一次的實體)過程中,為了防止頭文件重復包含的情況,采用預處理器的一個頭文件保護符功能,格式為:{ #ifndef 預處理變量(通常大寫) #define 預處理變量 #end…

《C++ Primer 第五版》(第3.5-3.6節) ——C++中的內置數組類型,string對象和C風格字符串

1.C中的內置數組類型 C中的數組是內置數據類型,但不是基礎數據類型而是構造數據類型,是有限個相同數據、占據著連續物理存儲空間的有序集合。而內置數據類型定義的下標運算符可以處理負值運算(只要在數組范圍之內),這和vector及string的下標運…

793. 階乘函數后K個零 golang

Me(AC 33 / 44 個通過測試用例) func preimageSizeFZF(K int) int {count : 0for i : 0; i < 1000000; i {if trailingZeroes(i) K {count}}fmt.Println(count)//fmt.Println(trailingZeroes(25))return count}func trailingZeroes(n int) int {if n 0 {return 0}return …

小程序radio單選框回顯

話不多說&#xff0c;效果圖如下&#xff1a; 具體代碼如下&#xff1a; <radio-group name"radio" bindchange"getSex"><label><radio value"1" checked"{{xingbie1}}" />男</label><label><radio…

172. 階乘后的零 golang

官解 一般很難想到這個方向&#xff0c;有點類似數學歸納法&#xff1f; func trailingZeroes(n int) int {if n 0 {return 0}return trailingZeroes(n / 5) n / 5 }

《C++ Primer 第五版》(第4.11節類型轉換) ————關于無符號數和有符號數的運算探究

1.關于無符號數和有符號數的運算 關于無符號數和有符號數的運算&#xff0c;在我看來一直是覺得只要有無符號數和有符號數的運算&#xff0c;有符號數就轉化為無符號數&#xff0c;但是在《C Primer 第五版》的p142介紹&#xff0c;關于無符號數和有符號數的運算如下規定的&…

《C++ Primer 第五版》(第4.1-4.11節) ——運算符的執行順序問題,負值坐商取余問題,數值的移位操作

1.運算符的執行順序問題 在C語言中&#xff0c;沒有明確規定大多數二元運算符的求值順序&#xff0c;這給編譯器留下了余地&#xff0c;這種策略是在代碼生成效率和程序潛在缺陷之間的權衡。 對于運算符而言&#xff0c;如果運算符的兩個對象中&#xff0c;存在表達式指向并修改…

543. 二叉樹的直徑 golang

文章目錄543. 二叉樹的直徑example正確解法question代碼&#xff08;wrong)543. 二叉樹的直徑 概要: 借鑒了這個題的代碼。可是有一個測試用例過不去 https://blog.csdn.net/csdn_kou/article/details/104122067 example 給定一棵二叉樹&#xff0c;你需要計算它的直徑長度。一…

《C++ Primer 第五版》(第4.11-4.12節)——static_cast,const_cast和reinterpret_cast類型轉換, 運算符優先級表

1.static_cast,const_cast和reinterpret_cast類型轉換 static_cast:強制的類型轉換(不能用于底層的const轉換),以前C語言中的強制類型轉換都可以使用static_cast來完成。如&#xff1a;int i3; double jstatic_cast<double>(i); const_cast&#xff1a;改變底層const(指針…

《C++ Primer 第五版》(第5.1-5.6節) ——異常處理機制(try語句塊,throw表達式和catch異常捕捉處理單元)

1. 異常處理機制 C中使用try,throw和catch三個關鍵字來實現異常的觸發、拋出和處理的功能&#xff0c;具體通用語法形式如下&#xff1a; try{ if(true) normal program-statements&#xff1b;//沒有觸發異常時候執行的代碼 if(false) throw(exception); //出現錯誤&am…

《C++ Primer 第五版》(第6.1~6.3節) 函數形參和實參傳遞,可變參數列表和函數返回值

1.函數形參和實參傳遞問題 函數參數傳遞有兩種&#xff1a;值傳遞(變量&#xff0c;指針&#xff09;,引用傳遞(使用別名&#xff09;。 在形參和實參的傳遞過程中&#xff0c;牽涉到大的類類型對象、容器類型對象或者不支持拷貝操作的對象時&#xff0c;不適合采用值傳遞&…

461. 漢明距離 golang

Me 異或取出1的個數求取異或后1的個數返回 func hammingDistance(x int, y int) int {x x ^ yvar count 0for x ! 0 {x x & (x - 1)count}return count }

《C++ Primer 第五版》(第6.3~6.7節)——返回指向數組/函數的指針,函數重載,默認形參、inline函數和constexpr函數

1.返回指向數組/函數的指針 顧名思義&#xff0c;就是函數返回值為指向數組/函數的指針。 數組的性質&#xff1a;不能被拷貝&#xff0c;函數也不能返回數組。但可以返回數組指針/引用&#xff0c;聲明一個返回數組指針的函數&#xff0c;有四種方式&#xff0c;一種是直接聲明…

136. 只出現一次的數字 golang

Me 1. 先排序就好做了 執行用時 :16 ms, 在所有 Go 提交中擊敗了27.90%的用戶 內存消耗 :4.7 MB, 在所有 Go 提交中擊敗了100.00%的用戶func singleNumber(nums []int) int {sort.Ints(nums)for i:0; i < len(nums); i {if i len(nums) - 1 {return nums[i]}if nums[i] …

《C++ Primer 第五版》(第1~6章總結)

1.C采用標準庫文件iostream定義的兩個對象來實現IO機制。 2.代碼注釋應解釋關鍵數據的變量含義和代碼完成了什么功能&#xff0c;力求簡潔易懂。 3.正確理解初始化和賦值&#xff0c;聲明和定義的含義&#xff1f;初始化是在定義對象的時候同時賦值&#xff0c;賦值是定義對象…

268. 缺失數字 golang

Me 首項加末項乘以項數/2.就是總和。然后剪掉nums里面的數組和 func missingNumber(nums []int) int {var sum intlens : len(nums)for _, value : range nums {sum value}return ((1 lens) * lens) / 2 - sum }

使用touch更新文件的時間

#&#xff01;/bin/bashfunction read_dir() {for file in ls $1doif[-d $1"/"$file]thenread_dir $1"/"$fileelseecho $1"/"$filetouch $1"/"$filefidone }read_dir ./

231. 2的冪 golang

Me func isPowerOfTwo(n int) bool {return n > 0 && (n & (n-1)) 0 }