当前位置: 首页 > news >正文

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.jsqmd.com/news/42255/

相关文章:

  • 20232414 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 物流管理,必须掌握的10个要点 - 智慧园区
  • 工程行业中-使用AI报价得可行性-一般(属于能应付但不精确,未测试在数据库全得情况下得效果,总体欠调教)
  • 力扣 第 476 场周赛(A~D)
  • libvte, xfce4-terminal和gnome-terminal,干货满满
  • 2025 年 11 月冷却塔厂家推荐排行榜,闭式冷却塔,方形冷却塔,工业冷却塔,全钢冷却塔,凉水塔,圆形冷却塔,玻璃钢冷却塔,防腐冷却塔,冷却水塔公司推荐
  • 寄卖业务质检1
  • [学习记录整理] ---IP地址,网关,掩码,DNS等
  • 2025 年 11 月不锈钢管件厂家权威推荐榜:欧标卡压管件,国标/薄壁/沟槽不锈钢管件,90/45弯头管件源头厂家精选
  • 3.分治算法的设计思想与分析方法
  • 2025.11.16总结
  • 2025 年 11 月冷拉/冷拔方钢厂家推荐排行榜,冷拉方钢,冷拔方钢,精密冷拉方钢,高强度冷拔方钢公司推荐
  • LeeCode_2 两数相加
  • 2025 年 11 月 CNC 高压清洗机厂家推荐排行榜,CNC全自动高压清洗机,CNC高压去毛刺清洗机,卧式/双工位CNC高压清洗机,数控高压清洗去毛刺机公司推荐
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拔扁钢厂家推荐排行榜,优质冷拔扁钢,高强度扁钢,精密扁钢公司精选
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拔圆钢厂家推荐排行榜,优质冷拔圆钢,高强度圆钢,合金结构钢圆钢公司精选
  • 移动银行安全测试的11个最佳实践
  • 2025 年 11 月冷拉/冷拔异型钢厂家推荐排行榜,精密冷拉异型钢,冷拔异型钢材,定制冷拉型钢,高强度冷拔钢公司推荐
  • 2025 年 11 月苹果仓厂家推荐排行榜,苹果仓民宿,移动房苹果仓,出口苹果仓,外贸出口苹果仓,集装箱苹果仓,景区苹果仓,苹果仓房屋,网红苹果仓,可移动式苹果仓公司推荐
  • 图像算法处理-OpenCV图像翻转SSE版(ippicv)复现
  • 2025 年 11 月 Q355B/Q345B/16Mn 扁钢厂家推荐排行榜,低合金高强度扁钢,结构用扁钢,优质扁钢批发公司推荐
  • 2025 年 11 月红木家具厂家权威推荐榜:交趾黄檀/小叶紫檀/巴里黄檀/缅甸花梨/阔叶黄檀,明清古典榫卯工艺高端定制全屋整装,白胚烘干实力解析
  • OI 笑传 #29
  • 2025 年 11 月广播设备厂家推荐排行榜,视讯广播,SI广播,数字IP广播,智能广播系统,定压功放,广播周边,广播话筒,广播机柜,SIP网络广播系统,公共广播系统公司推荐
  • 2025 年 11 月全自动智能点胶机厂家推荐排行榜,视觉定位点胶机,饰品/纽扣/拉链头/商标/钥匙扣/五金/徽章/线圈/硅胶/UV胶点胶设备公司精选
  • 2025 年 11 月 Q355B/Q345B/16Mn 圆钢厂家推荐排行榜,低合金高强度圆钢,结构用圆钢,合金钢圆钢公司精选
  • 2025 年 11 月磨粉机厂家推荐排行榜,雷蒙磨粉机,环辊磨粉机,摆式磨粉机,矿石磨粉机,超细磨粉机,高压磨粉机,大型磨粉机公司推荐
  • 2025 年 11 月冠晶石厂家推荐排行榜,外墙冠晶石,内墙冠晶石,防霉冠晶石,水包水冠晶石,水包砂冠晶石,耐污冠晶石,自洁冠晶石公司推荐
  • 2025 年 11 月试验机厂家推荐排行榜,拉力试验机,江都试验机,管材环刚度试验机,电子万能试验机,橡胶试验机,压缩试验机公司推荐
  • 2025 年 11 月家居智能制造系统厂家推荐排行榜:家居ERP,家居MES,家居CRM,家居ERP系统,家居MES软件,家居CRM产品公司推荐