第四章 复合类型

数组

  • 声明数组的通用格式
typeName arrayName[arraySize];
eg: short months[12];
  • arraySize 指定元素数目,它必须是整型常数或const值,也可以是常量表达式(如8 * sizeof(int)),即其中所有的值在编译时都是已知的。
  • 只有在定义数组时才能使用初始化,也不能将一个数组赋给另一个数组。
  • 不过可以使用下标分别给数组中的元素复制。
  • 初始化数组时,提供的值可以少于数组的元素数目。
  • 如果只对数组的一部分进行初始化,则编译器将把其他元素设置为0。
long totals[500] = {0};
//此数组将全部是0.
  • 如果初始化数组时方括号内为空,C++编译器将计算元素的个数。
  • 使编译器计算元素个数:
short things[] = {1,5,3,8};
int num_elements = sizeof things / sizeof(short);

字符串

  • 字符串是存储在内存的连续字节中的一系列字符。
  • C-风格的字符串会以空字符结尾。
char dog[5] = {'b','e','a','u','x'};//not a string
char cat[5] = {'f','a','t','s','\0'};//a string
  • 字符串常量是一个用引号括起的字符串,这种已经隐式地包括结尾的空字符。
 char fish[] = "Bubbles";
  • 各种C++输入工具通过键盘输入,将字符串读入到char数组中时,将自动加上结尾的空字符。
  • 在确定存储字符串所需的最短数组时,一定要将结尾的空字符计算在内。
  • 字符串常量(使用双引号)不能与字符常量(使用单引号)互换,字符常量(如’s’)是字符串编码的简写表示。
  • 任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个,拼接的时候并不会在两个字符串之间添加空格。
字符串的输入
  • std::cin()是使用空白(空格、制表符和换行符)来定字符串的界,所以cin只能读入一个单词,将其放进数组,并自动在结尾添加空字符。
  • 如果通过std::cin()输入的字符串比目标数组长,就会出错。
  • std::cin.getline()和std::cin.get()函数可以读取一行输入,直到到达换行符,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中.
  • 当使用get()读取空行时将设置失效位(failbit),这意外这接下来的输入将被阻断,但可以用cin.clear()命令来恢复。
  • 如果输入的字符串比分配的空间长或者包含的字符数比指定的多,则getline()和get()将把余下的字符留在输入队列中,而getline()还会设置失效位,并关闭后面的输入。

String类

  • string类位于名称空间std中,因此必须提供一条using编译指令。

结构

  • 结构是用户定义的类型。
  • 同一个结构可以存储多种类型的数据。
  • 使用关键字struct声明
struct inflatable // structure description
{
	char name[20];
	float valume;
	double price;
};
  • 结构声明的位置可以有两种:一种是可以将声明放在main()函数中,紧跟在开始括号的后面。另一种选择是将声明放到main()的前面。位于函数外面的声明被称为外部声明。外部声明可以被其后面的任何函数使用,而内部声明只能被该声明所属的函数时候用。通常应使用外部声明。
  • 变量也可以在函数外部和内部定义,外部变量由所有的函数共享。
  • C++不提倡使用外部变量,但提倡使用外部结构。另外,在外部声明符号常量通常更合理。

共用体

  • 共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。也就是说,结构可以同时存储int、long和double,共用体只能存储int、long或double。
  • 共用体使用union关键字进行声明,声明与结构类似。
  • 共用体的用途之一是,当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。
  • 由于共用体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员,所以,共用体的长度为其最大成员的长度。
  • 匿名共用体(anonymous union)没有名称,其成员将成为位于相同地址处的变量。显然,每次只有一个成员是当前的成员。

枚举

  • 枚举的句法结构:
enum spectrum { red, orange, yellow, green, blue, violet, indigo, ultraciolet};
//这条语句完成两项工作:
//1)让spectrum成为新类型的名称;spectrum被称为枚举(enumeratrion)。
//2)将red、orange、yellow等作为符号常量,他们对应整数值0~7。这些常量叫做枚举量(enumerator)。
  • 默认情况下,将整数值付给枚举量,第一个枚举量的值为0,第二个枚举量为1。可以通过显式地指定整数值来覆盖默认值。
  • 可以用枚举名来声明这种类型的变量:
    spectrum band;// band a veriable of type spectrum
  • 在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量付给这种枚举的变量。
  • 枚举量是整型,可被提升为int类型,但int类型不能自动转换成枚举类型。
  • 可以使用复制操作符啦显示地设置枚举量的值,指定的值必须是整数,也可以只显示地定义其中一些枚举量的值。
    enum bigstep{first, second = 100, third};
    这里,first默认是0,后面的将默认比前面的枚举量大1,所以third的值是101。
  • 可以创建多个值相同的枚举量
  • 最初,对于枚举来说,只有声明汇总指出的那些值是有效的。不过,C++现在通过强制类型转换,增加了可赋给枚举变量的合法值。
  • 每个枚举都有取值范围(range),通过强制类型转换,可以将取值范围中的任何整数值赋给枚举变量,即使这个值不少枚举值。
  • 取值的范围定义如下。首先找出上限,即枚举量的最大值。找到大于这个最大值的、最小的2的幂,将其减1,即为范围的上限。例如,前面的bigstep的最大值枚举值是101。在2的幂中,比这个数大的最小值为128,因此上限是127。要计算下限,需要制定枚举值的最小值,如果其不小于0,则下限值为0,否则,采取与寻找上限值相同的方法,但加上负号。
  • 选择用多少空间来存储枚举由编译器决定。对于取值范围较小的枚举,使用一个字节或更少的空间;而对于包含long类型的枚举,则使用4个字节。

自动存储、静态存储和动态存储

  • 根据用于分配内存的方法,C++有3中管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫自动存储空间或堆)。
自动存储
  • 在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。
静态存储
  • 静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:一种是在函数外部定义它;另一种是使用关键字static来声明变量。
动态存储
  • new和delete操作符提供了一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池,在C++中被称为自由存储空间(free store)。内存池同用于静态变量和自动变量的内存是分开的。new和delete运行在一个函数中分配内存,在另一个函数中释放它。因此,数据的生命周期就不完全受到程序或函数的生存时间控制了。

堆栈、堆和内存泄漏

  • 如果使用new创建变量之后,没有调用delete,即使包含指针的内存由于作用域规则和对象生命周期的原因而被释放,在堆上动态分配的变量或结构也将继续存在。实际上,将会无法访问堆上的结构,因为指向这些内存的指针无效,这将导致内存泄漏。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值