IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c++primer】2.5处理类型 typedef/using/auto/decltype -> 正文阅读

[C++知识库]【c++primer】2.5处理类型 typedef/using/auto/decltype

2.5.1 类型别名

typedef以及using,用于给类型起别名,定义类型别名。

?

给double起别名命名为db,再给db起别名命名为d,此时db,d都指代的是double。第三行又将db*也就是double*命名为pd,所以pd=double*。

给类名Sales_item命名为SI。?

?

如果某个类型别名指代的是复合类型或常量,则会与之前的规定有所区分,如:

此处pstring指代的是复合类型:指针类型(指向char类型的指针)。下面展示了变化:

252行 此处的cstr1是一个指向字符型的常量指针,也就是const修饰的是cstr1,这个常量指针存储的是c1的地址。而如果进行一个错误的行为:即把pstring拆开去理解条语句就会发生错误:如255行所示,此处的cstr2,是一个指向常量字符的指针,也就是不允许通过cstr2来改变字符c1。

如253,254所示,通过cstr1改变所指对象c1是允许的,而改变cstr1这个指针的指向是不允许的,因为252表达的是cstr1是一个常量指针。而如果错误的拆分为255去理解的话,就会发生变化。

这也就是为什么说如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。

2.52 auto类型说明符

auto这个类型说明符好像是在c++11新引入的。在看后面的章节过程中,发现auto这个类型说明符使用频率极高且极其方便,所以需要认真学习。(但是此章节内又给不出太复杂或实用的例子...)

当需要把表达式的值赋给变量时,我们需要根据表达式的值指定变量的类型,但是有的时候想知道表达式的类型或者写出这个类型有很麻烦。所以:auto能让编译器替我们去分析表达式所属的类型,让编译器通过初始值推算变量的类型。显然auto定义的变量必须有初始值。

1.? 例子:?

此处的局部变量i的定义就用到了auto。

?注意1

使用auto也能在一条语句中声明多个变量,因为一条声明语句只能有一个基本数据类型,所以语句中所有变量的初始基本数据类型必须都一样。

?

这个报错信息说明的就很清楚了。

?注意2:

auto类型说明符在某些情况下又有一些特殊之处。?

如上图,给变量at初始化时,运用的是一个引用,此时编译器以引用对象的类型作为auto的类型?

注意3:

auto一般会忽略顶层const(修饰变量本身的const),同时底层const则被保留下来。

??

解释:即如果给auto类型的变量初始化的值有顶层const属性,如a,这个常属性会被忽略,auto定义的变量不会有常属性。即int c1。

而如果用于初始化的变量是一个指向常量的指针时,即&a,这就属于一种底层const,此时被auto声明的变量就是一个指向常量的指针,不能通过c2去改变它所指向对象的值。(其实不去想这些规则,c2是一个指向常量整形的指针也是合情合理的,总不能把一个常量的地址赋给一个auto类型的变量之后,这个变量就可以改变这个常量了吧,这显然是不合理的)

如果希望推断出的auto类型是一个顶层const,需要明确指出

如果将引用的类型设为auto,则初始值中的顶层const不会忽略,会保留下来。原来的规则仍然适用。如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。

如图,m是const int&类型,本质上也就是const int类型,此时初始值的顶层const被保留了下来。而p的是const int *p?。表示指向常量整型的指针。不能改变m以及*p。

综上:当指定为auto类型时,会忽略掉初始值的顶层const。而设定为auto的引用类型时,就相当于给那个初始值起了一个别名,如果原先他就具有顶层const属性,那么引用过来也具有顶层const。这是合情合理的。而定义auto指针时,原先初始值的顶层const会变成底层const。即不允许通过指针改变指向的值。

快吐了= =

练习题:

?i是整型常量,j是整型(顶层const被忽略了),k是const int(事实上不加const,k的性质也不变),p是指向const int 的指针,类型应该是(const int *)。j2是const int类型,此处的顶层const是强制添加的。k2是const int&(事实上不加前面的const,k2也是const int&类型)

decltype 类型指示符

decltype是”declare type“的缩写,译为“声明类型”。

decltype的作用就是当定义一个变量时,只想用一个表达式的类型去定义这个变量,而不想用表达式的值时,可以用decltype。

decltype处理顶层const和引用的方式和auto有些不同,如果decltype使用的表达式是一个变量时,则返回的是这个变量的类型,包括变量的顶层const和引用在内)。即decltype使用的变量是什么类型,那么返回的就是什么类型。不会削减。

引用从来都是作为其所指对象的同义词出现的,只有在用decltype处是一个例外。

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:13:21  更:2022-03-15 22:17:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:59:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码