【带头学C++】 ----- 1.基础知识 ---- 1.20 Typedef 为已有的类型取别名

news2024/12/24 11:27:52

1.20 Typedef 为已有的类型取别名

1.typedef语法格式

在 C++ 中,可以使用 typedef 关键字来为已有的类型创建一个别名。这对于提高代码可读性、简化类型声明以及增加代码的可维护性非常有用。

下面是 typedef 的语法格式:

typedef 旧类型名 别名;

2.使用typedef为已有类型取别名

示例展示了如何使用 typedef 为已有的类型创建别名:

typedef int MyInt;  // 将 int 类型命名为 MyInt

typedef double Distance;  // 将 double 类型命名为 Distance

typedef char* CString;  // 将 char* 类型命名为 CString

typedef void (*FuncPtr)(int);  // 将函数指针类型命名为 FuncPtr

typedef struct {
    int x;
    int y;
} Point;  // 将匿名结构体定义为名为 Point 的类型

typedef std::vector<int> IntVector;  // 将 std::vector<int> 类型命名为 IntVector

通过为已有类型创建别名,我们可以使用别名来声明变量、函数参数、返回值类型等,这样可以增加代码的可读性和易于理解性。例如:

MyInt num = 42;  // 使用别名 MyInt 声明变量
Distance dist = 3.14;  // 使用别名 Distance 声明变量

void PrintString(CString str) {
    // 使用别名 CString 定义函数参数
    // ...
}

FuncPtr func = nullptr;  // 使用别名 FuncPtr 声明函数指针变量

Point p;  // 使用别名 Point 声明结构体变量

IntVector vec;  // 使用别名 IntVector 声明向量容器变量

3.typedef使用步骤

注意:不能创建新类型,实际上就是将长且复杂的类型名,取一个精简的类型名。

typedef作用的步骤
1、先用已有的数据类型定义一个普通的变量
2、用新的别名替换原变量名
3、在整个表达式最前方加关键字:typedef

1.案例,将int arr[3];取别名

int arr[3];  //第一步    找到你需要取别名的类型

typedef int num[3];//取别名 

 num arr;//用新的别名创建一个arr

1.21 转义字符

1. \和某些字符 结合 产生新的字符含义 就叫转义字符

0== ASCII 为0
== 换行符n'
t'== tab缩进符
r==回到行首符号
==发出警报a'

2 八进制转义

ddd’每个d的范围必须是0-7 3个d表示最多识别3位八进制数据以下字符描述正确的是  A

A:  123'    B:18     C:' 1234'       D:183

3 十六进制转义

\xhh'每个h的范围0-9 a-f 2个h表示最多识别2位十六进制以下字符描述正确的是   BD

A:' af'    B:' 123'     C:  x3df'      D:  xab

4.常见的转义字符符号

在 C++ 中,转义字符用于表示一些特殊字符,它们以反斜线 \ 开始,并在后面跟着一个字符。下面是一些常见的 C++ 转义字符:

  • \\:反斜线
  • \':单引号
  • \":双引号
  • \n:换行符
  • \r:回车符
  • \t:制表符
  • \b:退格符
  • \f:换页符
  • \a:警报符(输出提示音)
  • \v:垂直制表符
  • \0:空字符(以 NUL 字符表示)

这些转义字符可以嵌入到字符串常量中,以表示特定的字符或执行特定的操作。例如:

cout << "Hello\tWorld\n";  // 输出:Hello   World(使用制表符和换行符)
cout << "She said, \"Hello!\"\n";  // 输出:She said, "Hello!"(使用双引号)
cout << "C:\\Program Files\\MyApp\n";  // 输出:C:\Program Files\MyApp(使用反斜线)
cout << "Beep!\a\n";  // 输出:Beep!(并发出警报音)

需要注意的是,在 C++11 及更高版本中,还引入了一种称为原始字符串字面量 (raw string literals) 的特殊语法,可以避免使用转义字符。原始字符串字面量以 R"(" 和 ")“ 开始和结束,并且可以在其中包含任何字符而不需要转义。例如:

cout << R"(This is a raw string literal containing "double quotes" and \backslashes\.)" << endl;
// 输出:This is a raw string literal containing "double quotes" and \backslashes\.

 1.22 类型转换

      C++ 中的类型转换(Type Casting)是将一个数据类型的值转换为另一个数据类型的过程。类型转换可以通过显式转换(Explicit Casting)和隐式转换(Implicit Casting)来实现。数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题转换的方法有两种

1. 隐式转换(Implicit Casting)

   隐式转换是指在不需要显式指定的情况下自动进行的类型转换。它发生在以下情况下:
   当一个表达式中包含不同类型的操作数时,编译器会自动执行类型提升或类型转换以匹配操作数的类型。例如,将整数和浮点数相加时,整数会被隐式转换为浮点数。
   当调用函数时,如果传递的实参的类型与形参的类型不完全匹配,但是可以通过隐式转换实现匹配,编译器也会自动进行类型转换。

自动转换:
遵循一定的规则,由编译系统自动完成强制类型转换。

2. 显式转换(Explicit Casting)强制类型转换

   显式转换是指将类型转换操作显式地指定在代码中的过程。它可以通过 C++ 中提供的四种转换操作符来实现:(智能指针
   static_cast:用于执行任意合理的类型转换,如数值类型之间的转换、指针类型之间的转换、向上或向下转换等。
   reinterpret_cast:用于进行底层的重新解释转换,将一个对象的二进制表示解释为另一种类型。这种转换通常非常危险,需要谨慎使用。
   const_cast:用于去除变量的常量性或增加变量的常量性。
   dynamic_cast:用于在继承关系中的向上转型和向下转型。它进行类型检查,并在运行时检测转换的有效性。

需要注意的是,类型转换应该谨慎使用,确保转换的类型是兼容的,以避免数据的丢失或无效的转换。隐式转换的过多使用可能会导致代码可读性降低,因此建议在需要转换类型的地方使用显式转换符来明确指定转换操作。在进行类型转换操作时,应该理解转换的操作和可能带来的影响,并遵循最佳实践。

例如:

int a = 10;
double b = static_cast<double>(a);  // 隐式转换为浮点数
char c = static_cast<char>(b);  // 显式转换为字符
int* ptr1 = reinterpret_cast<int*>(a);  // 重新解释为指针
const int* ptr2 = const_cast<const int*>(ptr1);  // 去除指针的常量性
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base);  // 向下转型,进行类型检查

3.转换原则

  1. 数字类型之间的转换

  • 小范围整数类型可以自动转换为大范围整数类型,例如将 int 赋值给 long
  • 整数类型可以自动转换为浮点数类型,例如将 int 赋值给 double
  • 浮点数类型可以自动转换为整数类型,但可能会导致小数部分被截断,例如将 double 赋值给 int
  1. 数组和指针之间的转换:
    • 数组名可以自动转换为指向数组首元素的指针。
    • 指向派生类的指针可以自动转换为指向基类的指针(向上转型),但相反的转换需要显式的类型转换。
  2. 枚举类型和整数类型之间的转换:
    • 枚举类型可以自动转换为整数类型,例如将枚举变量赋值给 int
  3. 布尔类型和整数类型之间的转换:
    • false 被视为整数 0, true 被视为整数 1
  4. const 限定符的转换:
    • const 限定符可以通过 const_cast 进行去除,允许对变量进行修改。
    • const 限定符不能通过直接赋值的方式去除,除非使用 const_cast 进行显式转换。

需要注意的是,默认类型转换只适用于满足一定条件的类型,并且转换可能会导致精度损失或数据截断。对于不同类型之间的转换,应该谨慎考虑可能带来的副作用,并在需要的情况下使用显式类型转换。

该图片引用了千锋教育C++课程中对转换关系方向解释的图例,主要是展示了转换的方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity的碰撞检测

&#xff08;一&#xff09;测试前准备工作 1.创建两个游戏对象&#xff0c;分别取名为”Player”和”Enemy”&#xff0c;并且为名为”Player”的游戏对象设置Tag也为”Player”&#xff0c;二者在场景中如图1所示&#xff1a; 图1 绿为Enemy&#xff0c;红为Player 2.编写脚本…

《Linux从练气到飞升》No.22 Linux 进程间通信

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

kafka入门03——简单实战

目录 安装Java 安装Zookeeper 安装Kafka 生产与消费 主要是记录下Kafka的安装配置过程&#xff0c;前置条件需要安装jdk和zookeeper。 安装Java 1.Oracle官网下载对应jdk安装包 官网地址&#xff1a;Java Downloads | Oracle 好人分享了下载需要的oracle账号&#xff0c…

linux基本指令(Chapter 2)

linux基本指令(二) 1.date指令 语法:date [option] [format] date命令的作用是显示时间:使用date %Y:%m:%d可以指定格式显示时间.例如:(注意这里的和%之后不要有任何间隔)并且这里是加号,并不是减号 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设…

NeRF综述

文章目录 《Nerf: Neural radiance field in 3d vision, a comprehensive review 》一、数据集&#xff1a;二、基于方法的分类&#xff08;Method-based Taxonomy&#xff09;三、基于应用的分类&#xff08;Application-based Taxonomy&#xff09;四、未来展望 《Nerf: Neur…

盘点网安最好入手的10大岗位,最高月薪30K!

前段时间&#xff0c;知名机构麦可思研究院发布了《2022年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;信息安全位列第一。 对于网络安全的发展与就业前景已经说过很多&#xff0c;它是收入较高的岗位之一&#xff0c;在转行领域也占据着热…

番外8.1 Task

---------系统中有两个账号&#xff0c;分别是alex与arod&#xff0c;这两个账号除了支持自己的组&#xff0c;还共同支持一个名为project的组。如这两个账号需要共同拥有/srv/ahome/目录的开发权&#xff0c;且该目录不允许其他账号进入查阅&#xff0c;请问该目录的权限应如何…

动手学深度学习—含并行连结的网络GoogLeNet(代码详解)

目录 1. Inception块3. GoogLeNet模型3. 训练模型 GoogLeNet吸收了NiN中串联网络的思想&#xff0c;并在此基础上做了改进&#xff0c;并且在2014年的ImageNet图像识别挑战赛中获得了不错的效果。 1. Inception块 GoogLeNet论文解决了多大的卷积核最合适的问题。 Inception块…

yolo数据增强,同时旋转txt标签文件

github https://github.com/vkdx/vkdx_cnn-.git YOLO格式txt文件分析 标注好的txt文件中有对应每个标注框的信息,从左到有分别是&#xff1a; class:类别 x_center&#xff1a;标注框中心相对于图像的x坐标 y_center&#xff1a;标注框中心相对于图像的y坐标 w&#xff1a;标…

Day09字符流缓冲流序列化流IO框架

字符流 FileReader&#xff08;文件字符输入流&#xff09; 使用文件字符输入流&#xff0c;有啥好处&#xff1f; 读取中文不会出现乱码问题 FileWriter(文件字符输出流) 利用字符流将一个文本文件复制到E:盘下&#xff0c;例如&#xff1a;D:/1.txt复制到E:/2.txt 请使用…

C语言每日一题(17)数组匹配

牛客网 BC156 牛牛的数组匹配 题目描述 描述 牛牛刚学会数组不久&#xff0c;他拿到两个数组 a 和 b&#xff0c;询问 b 的哪一段连续子数组之和与数组 a 之和最接近。 如果有多个子数组之和同样接近&#xff0c;输出起始点最靠左的数组。 输入描述&#xff1a; 第一行输…

如何在不损失质量的情况下调整图像大小

如何在不损失质量的情况下调整图像大小 如果您在线工作&#xff0c;就会知道图像质量对于呈现干净专业的外观有多么重要。 库存图像和免版税图像很容易找到&#xff0c;但是如何在不损失质量的情况下调整图像大小以使其适合您的目的&#xff1f; 无论您是想将图片用于博客文…

【Java变量】 局部变量、成员变量(类变量,实例变量)、方法参数传递机制

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 变量 1. 局部变量与成员变量的区别&#xff1a…

小白必看,手把手教你安装Python

目录 一&#xff0c;Python介绍 二&#xff0c;安装 Python 三&#xff0c;各种疑难杂症&#xff1a; 一&#xff0c;Python介绍 Python 是这两年来比较流行的一门编程语言&#xff0c;主要卖点是其相对简单的语法以及丰富的第三方库&#xff0c;下面我来带大家安装、配置 P…

【七】SpringBoot为什么可以打成 jar包启动

SpringBoot为什么可以打成 jar包启动 简介&#xff1a;庆幸的是夜跑的习惯一直都在坚持&#xff0c;正如现在坚持写博客一样。最开始刚接触springboot的时候就觉得很神奇&#xff0c;当时也去研究了一番&#xff0c;今晚夜跑又想起来了这茬事&#xff0c;于是想着应该可以记录一…

Redis数据类型——list类型介绍及基本操作

1.list类型介绍 redis中的list就是一个双向链表的结构 2.list类型数据基本操作

己知一棵有 2011 个结点的树,其叶结点个数为 116,该树对应的二叉树无右孩子的结点个数是

前言 树转二叉树的规则&#xff1a;每个结点左指针指向它的第一个孩子&#xff0c;右指针指向它在树中相邻的右兄弟&#xff0c;即“左孩子右兄弟“。 拓展&#xff1a;树中一个叶子节点在转化为二叉树的时候&#xff0c;如果它有右兄弟&#xff0c;那么它右指针会指向其兄弟节…

【软件安装】Linux系统中安装MySQL数据库服务

这篇文章&#xff0c;主要介绍如何在Linux系统中安装MySQL数据库服务。 目录 一、Linux安装MySQL 1.1、下载MySQL安装包 1.2、解压MySQL安装包 1.3、更改存放目录 1.4、创建用户组和用户 1.5、创建数据目录data 1.6、创建my.cnf配置文件 1.7、初始化数据库 1.8、添加m…

报告从root到sink的clock tree物理长度的脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 距离clock root物理距离最远的sink未必是latency最大的,但是往往clock path的长度受其影响,比如一些寄存器放在距离clock root很远的channel里,与其balance的reg就需要垫 delay detour buffer,即…

【Maven教程】(九):使用 Maven 进行测试 ~

目录 1️⃣ account-captcha 1.1 account-captcha 1.2 account-captcha 的主代码 1.3 account-captcha的测试代码 2️⃣ maven-surefire-plugin 简介 3️⃣ 跳过测试 4️⃣ 动态指定要运行的测试用例 5️⃣ 包含与排除测试用例 6️⃣ 测试报告 6.1基本的测试报告 6.…