C++之复合类型(四) - Invinc

本文记录了C++中与复合类型相关的容易遗忘的一些知识。


内置数组

初始化

只有在定义数组时才能使用初始化形式。之后不能使用,也不能将一个数组整体赋值给另一个数组:

int cards[4] = {3, 6, 8, 10}; // okay
int hand[4]; // okay
hand[4] = {5, 6, 7, 9}; // not allowed
hand = cards; // not allowed

C++11内置数组特性:

// drop the = sign when initializing an array:
double earnings[4] {1.2e4, 1.6e4, 1.1e4, 1.7e4}; // okay with C++11// use empty braces to set all the elements to 0:
unsigned int counts[10] = {}; // all elements set to 0
float balances[100] {}; // all elements set to 0

字符串

逐行读取字符串输入

对于istream类(cin就是该类的一个实例),它有一些面向行的类成员函数:getline()get()。这两个函数都会读取一整行输入——也就是说,一直读到换行符为止。不过,getline()会随后丢弃这个换行符,而get()则会将其留在输入队列中。

getline()

cin.getline(name,20);

getline()通过标记行尾的换行符读取输入,但不会保存换行符。相反,在存储字符串时,它会将换行符替换为空字符。

get()

istream类有另一个成员函数get(),它有好几种变体。其中一种变体的作用和getline()很像。它接受相同的参数,以相同的方式解析这些参数,并读取到行尾。但与读取并丢弃换行符不同,get()会将该字符留在输入队列中。假设你连续两次调用get()

cin.get(name, ArSize);
cin.get(dessert, Arsize); // a problem

因为第一次调用会在输入队列中留下换行符,所以这个换行符是第二次调用看到的第一个字符。因此,get()函数会认为自己已经到达行尾,却没有找到任何可读取的内容。如果没有帮助,get()函数根本无法跳过那个换行符。

有一种get()的变体可以提供帮助。调用cin.get()(不带任何参数)会读取下一个单个字符,即便是换行符也不例外,所以你可以用它来处理换行符,为下一行输入做好准备。也就是说,下面这个序列是有效的:

cin.get(name, ArSize); // read first line
cin.get(); // read newline
cin.get(dessert, Arsize); // read second line

使用get()的另一种方法是将两个类成员函数连接起来,如下所示:

cin.get(name, ArSize).get(); // concatenate member functions

之所以能做到这一点,是因为cin.get(name, ArSize)会返回cin对象,然后该对象被用作调用get()函数的对象。同样地,下面的语句会将连续的两行输入读入数组name1name2,这相当于两次分别调用cin.getline()

cin.getline(name1, ArSize).getline(name2, ArSize);

为什么有了getline()还要使用get()

为什么有了getline()还要使用get()呢?首先,较旧的实现可能没有getline()。其次,get()能让你更谨慎一些。例如,假设你用get()将一行内容读入一个数组。怎样判断它是读取了整行内容,还是因为数组已满而停止读取的呢?看看下一个输入字符就知道了。如果是换行符,那就说明读取了整行;如果不是换行符,那就意味着该行还有更多输入内容。简而言之,getline()使用起来稍简单一些,但get()错误检查更简便。


结构体

结构体中的位域

和C语言一样,C++允许你指定占据特定位数的结构成员。这在创建与某些硬件设备上的寄存器相对应的数据结构时会很方便。位域的类型应该是整数类型或枚举类型,冒号后面跟一个数字表示要使用的实际位数。你可以使用未命名的位域来提供间距。每个成员都被称为位域。下面是一个例子:

struct torgle_register
{
unsigned int SN : 4; // 4 bits for SN value
unsigned int : 4; // 4 bits unused
bool goodIn : 1; // valid input (1 bit)
bool goodTorgle : 1; // successful torgling
};

你可以用常规方式初始化这些字段,并且可以使用标准的结构表示法来访问位字段:

torgle_register tr = { 14, true, false };
...
if (tr.goodIn) // if statement covered in Chapter 6

联合体

定义

联合体是一种数据格式,它可以存储不同的数据类型,但每次只能存储一种类型。也就是说,结构体可以同时存储例如一个int、一个long和一个double,而联合体只能存储一个int、或一个long或者一个double。共用体的语法与结构体类似,但含义不同。例如,请看下面的声明:

union one4all
{int int_val;long long_val;double double_val;
};

由于联合体一次只能存储一个值,所以它必须有足够的空间来容纳其最大的成员。因此,联合体的大小等于其最大成员的大小


枚举

定义

C++的枚举功能为创建符号常量提供了一种替代const的方式。它还允许定义新类型,但方式相当受限。枚举的语法类似于结构体语法。例如,考虑以下语句:

enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

注意:成员值之间分隔符用的是逗号,结构体和联合用的是引号;

该语句有两个作用:

  • 使spectrum成为一种新类型的名称;spectrum被称为枚举,就像结构体变量被称为结构体一样。
  • redorangeyellow等确立为整数值0到7的符号常量。这些常量被称为枚举量。

指针

指针与数组名的区别

第一个区别是,你可以改变指针的值,而数组名是一个常量:

pointername = pointername + 1; // 有效
arrayname = arrayname + 1; // 不允许

第二个区别是,对数组名应用sizeof运算符会得到数组的大小,但对指针应用sizeof会得到指针的大小,即使该指针指向数组。这是C++不将数组名解释为地址的一种情况。

数组的地址

对数组取地址是数组名称不被解释为其地址的另一种情况。数组的名称难道不是被解释为数组的地址吗?并不完全是——数组的名称被解释为数组首元素的地址,而使用地址运算符则会得到整个数组的地址:

short tell[10]; // tell是一个20字节的数组
cout << tell << endl; // 显示&tell[0]
cout << &tell << endl; // 显示整个数组的地址

从数值上看,这两个地址是相同的,但从概念上讲,&tell[0]tell也是)是一个2字节内存块的地址,而&tell是一个20字节内存块的地址。所以表达式tell + 1会使地址值增加2,而&tell + 1会使地址值增加20。换一种说法,tell的类型是指向short的指针(即short *),而&tell的类型是指向包含20个short的数组的指针(即short (*)[20])

现在你可能会好奇最后那个类型描述是怎么来的。首先,下面是如何声明并初始化该类型的指针:

short (*pas)[20] = &tell; // pas指向包含20个short的数组

如果省略括号,根据优先级规则,[20]会先与pas关联,使pas成为一个包含20个指向short的指针的数组,所以括号是必需的。其次,如果你想描述一个变量的类型,可以以该变量的声明为指导,并去掉变量名。因此,pas的类型是short (*)[20]。另外需要注意的是,由于pas被赋值为&tell,所以*pas等同于tell,因此(*pas)[0]就是tell数组的第一个元素。

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

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

相关文章

20232414 2025-2026-1 《网络与系统攻防技术》实验五实验报告

20232414 2025-2026-1 《网络与系统攻防技术》实验五实验报告 1.实验内容 总结一下本周学习内容,不要复制粘贴 2.实验过程 3.问题及解决方案问题1:XXXXXX 问题1解决方案:XXXXXX 问题2:XXXXXX 问题2解决方案:XXXXX…

物流管理,必须掌握的10个要点 - 智慧园区

一说到物流,就很容易出现这些情况—— 老板说库存不是积压就是缺货,成本一直居高不下; 员工说部门之间信息不透明,这个说没收到订单,那个说以及发货但是没显示; 客户说一直看不到货物配送状态,都不知道到底发没…

工程行业中-使用AI报价得可行性-一般(属于能应付但不精确,未测试在数据库全得情况下得效果,总体欠调教)

起因 事件起因是之前答应朋友测试ai造价(假)得可行性,然后我就问了我朋友要了份文件思路 总体思路是使用csv文件去进行读写,所以首先就是将需要报价得表格转为为csv格式,有些ai可以直接读写excel,不过建议输出还…

41

所学时间:9小时

VB6介绍

VB6介绍Posted on 2025-11-17 00:00 lzhdim 阅读(0) 评论(0) 收藏 举报 Austin Liu 刘恒辉 ProjectManager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢…

力扣 第 476 场周赛(A~D)

力扣 第 476 场周赛(A~D)$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");A:3745. 三元素表达式的最大值签到题,直接排序,首尾分别取两个和一个就可以了。1…

libvte, xfce4-terminal和gnome-terminal,干货满满

GTK+是GNOME桌面环境的核心图形库‌‌,它俩的关系像GDI和Windows的关系(不讨论GDI+和WPF)。 GTK+(GIMP Toolkit)最初是为GIMP图像处理软件开发的。 VTE,即Virtual TErminal widget,是GTK+的一部分。widget像Win…

2025 年 11 月冷却塔厂家推荐排行榜,闭式冷却塔,方形冷却塔,工业冷却塔,全钢冷却塔,凉水塔,圆形冷却塔,玻璃钢冷却塔,防腐冷却塔,冷却水塔公司推荐

2025 年 11 月冷却塔厂家推荐排行榜:专业选购指南与权威品牌分析 在工业生产与商业设施运行中,热交换设备扮演着至关重要的角色。冷却塔作为工业循环水冷却系统的核心装置,其性能优劣直接关系到整个系统的运行效率与…

寄卖业务质检1

售中抽检 用户下单 -判断是否检测 Y/N -判断检测方式 -免检 -运中检查 -白名单商家上门检测 if 免检 -通知订单出库 if 运送中检查 -替换收货地址 if 白名单用户 -订单标记为待质检 -订单待质检标记变更 -上门质检 -接…

[学习记录整理] ---IP地址,网关,掩码,DNS等

起兴莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。写在前面 这篇博客方便知识点的记录和日后的学而时习之。笔者梦到哪里写到哪里,如有不对之处,请读者纠正见谅。 正文 1. IP地址IP地址是…

2025 年 11 月不锈钢管件厂家权威推荐榜:欧标卡压管件,国标/薄壁/沟槽不锈钢管件,90/45弯头管件源头厂家精选

2025 年 11 月不锈钢管件厂家权威推荐榜:欧标卡压管件,国标/薄壁/沟槽不锈钢管件,90/45弯头管件源头厂家精选 行业背景与发展现状 不锈钢管件作为现代建筑给排水、供气、供暖及工业设施中不可或缺的连接元件,其技术…

3.分治算法的设计思想与分析方法

3.1分治算法的设计思想 1.分治策略 基本思想&实例 基本思想:实例一:二分检索 算法&设计思想&时间复杂度 算法:设计思想:时间复杂度:实例二:二分归并排序 算法&设计思想&时间复杂度 算法:设计思想:…

2025.11.16总结

梳理了目前的作业和任务 1.儿童故事 现在已经实现了三个接口的调用。目前的任务是将其商业化美化。还有用户登录的逻辑要不要去实现。 接下来需要做的。 1.故事能分页,搜索。 2.故事详情界面能够看到每个字的拼音,并…

2025 年 11 月螺杆泵厂家推荐排行榜,单干污泥料斗,浆料进料喂料,高压耐磨石油工业,化工环保食品级,船舶造纸加药计量,耐腐蚀高粘度污水污泥,不锈钢铸铁304316螺杆泵公司推荐

2025年螺杆泵行业深度解析与权威推荐榜单 行业背景与发展现状 螺杆泵作为现代工业流体输送的核心设备,其技术发展与应用创新始终与工业进步保持同步。随着环保要求的提高和工艺复杂度的增加,螺杆泵在单干污泥处理、料…

2025 年 11 月冷拉/冷拔方钢厂家推荐排行榜,冷拉方钢,冷拔方钢,精密冷拉方钢,高强度冷拔方钢公司推荐

2025 年 11 月冷拉/冷拔方钢厂家推荐排行榜 行业背景与发展趋势 冷拉/冷拔方钢作为现代制造业的重要基础材料,在机械制造、汽车工业、电梯制造等领域发挥着关键作用。随着我国制造业向高质量方向发展,对冷拉方钢、冷…

LeeCode_2 两数相加

2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 …

2025 年 11 月 CNC 高压清洗机厂家推荐排行榜,CNC全自动高压清洗机,CNC高压去毛刺清洗机,卧式/双工位CNC高压清洗机,数控高压清洗去毛刺机公司推荐

2025年CNC高压清洗机行业深度解析与权威推荐榜单 行业背景与发展趋势 随着制造业向高质量、高效率方向转型,CNC高压清洗技术作为精密制造领域的重要环节,正迎来前所未有的发展机遇。在航空航天、汽车制造、医疗器械等…

每日一导5

Problem 已知函数 $ f(x)= \ln ( x+1) -x+\frac{x^2}{2} - kx^3 \hspace {0.2cm} (0<k< \frac{1}{3} ) $ . (1)证明: $ f(x) $ 在 $ (0,+\infin)$ 上有唯一极值点和零点. (2)设 $ x_1,x_2 $ 分别为 \(f(x)\) 的极…

2025 年 11 月 Q355B/Q345B/16Mn 冷拔扁钢厂家推荐排行榜,优质冷拔扁钢,高强度扁钢,精密扁钢公司精选

2025 年 11 月 Q355B/Q345B/16Mn 冷拔扁钢厂家推荐排行榜,优质冷拔扁钢,高强度扁钢,精密扁钢公司精选 在工业制造领域,冷拔扁钢作为基础结构材料,其质量直接影响机械设备的性能和寿命。Q355B、Q345B 和 16Mn 冷拔…