《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.mzph.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 }