C++ Primer Plus:第四章 - 复合类型

0、本章内容:

创建和使用数组。

创建和使用C-风格字符串。

创建和使用string类字符串。

使用方法getline()和get()读取字符串。

混合输入字符串和数字。

创建和使用结构。

创建和使用共同体。

创建和使用枚举。

创建和使用指针。

使用new和delete管理动态内存。

创建动态数组。

创建动态结构。

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

vector和array类简介。

1、数组:

声明以下:元素值类型、数组名、数组中元素数。

元素数不能是变量,必须是整型常数或const值。

1.1 程序说明

只需提供一个用逗号分隔的值列表,并将它们用花括号括起来即可。

1.2 数组的初始化规则

只有定义数组时才能初始化,也不能将一个数组赋给另一个数组。

1.3 C++11数组初始化方法

初始化数组时,可以省略=号。
可不在大括号内包含任何东西,这将把所有元素都设置为零。
列表初始化禁止缩窄转换。

2、字符串:

赋值给字符串如果超出给定的长度,会在程序运行结束后报错。

2.1 拼接字符串常量

输出时,任何两个由空白分隔的字符串常量都将自动拼接成一个。

2.2 在数组中使用字符串

将字符串存储到数组中,常用方法:将数组初始化为字符串常量、将键盘或文件输入到数组中。

2.3 字符串输入

cin用空白字符确定字符串结束位置,但此空白字符保留,下一次读取会从第一个非空白字符开始。

2.4 每次读取一行字符串输入

getline()使用回车键输入的换行符来确定输入结尾,并用空字符代替换行符存入数组中。
get()则不能跳过换行符,需要使用cin.get()将此读取。

使用getline()简单一点,但是get()使得检查错误更加简单。

get()遇到空行时,将会发生阻断,结束读取。

2.5 混合输入字符串和数字

cin与get()混用时,记得丢弃缓冲区的换行符。

3、string类简介:

3.1 C++11字符串初始化

允许将列表初始化用于C-风格字符串和string对象。

3.2 赋值、拼接和附加

允许一个string对象赋值给另一个string对象,也可以使用+将两个string对象合并起来。

3.3 string类的其他操作

处理string对象的语法通常比使用C字符串函数简单。

3.4 string类I/O

当char数组没有初始化的时候,计算长度会到第一个空字符。

不能用类方法对string字符串进行读取,如cin.getline(str),而是使用getline(cin,str)。

3.5 其他形式的字符串字面值

C++还有类型wchar_t,C++11新增了类型char16_t和char32_t。

C++11新增一种原始字符串,以"(和)“用作定界符,并使用前缀R来标识原始字符串。
为了防止输入特定字符,原始字符串允许使用”+(和)+"代替默认界定符,但+不可为空格、斜杠、括号和控制字符。

4、结构简介:

结束结构声明“;”。

使用时可以省略关键词struct。

4.1 在程序中使用结构

注意声明的位置和使用范围,一般在函数外部声明。

4.2 C++11结构初始化

C++11也支持将列表初始化用于结构,且“=”是可选的。

4.3 结构可以将string类用作成员吗

可以,但是记得定义名称空间,比如:std::string。

4.4 其他结构属性

支持成员赋值,支持同时完成定义结构和创建结构变量,甚至可以允许同时初始化该变量。

可以声明没有名称的结构类型,方法是省略名称,同时定义一种结构类型和变量,但是不能再创建这种类型的新变量。

4.5 结构数组

可以创建元素为结构的数组,方法和创建基本类型数组完全相同。

4.6 结构中的位字段

允许指定占用特定位数的结构成员,也可以使用没有名称的字段来提供间距。

5、共用体:

能够存储不同的数据类型,但是只能同时存储其中的一种类型,创建方法与创建结构体方法相似。

匿名共同体没有名称,其成员将成为位于相同地址处的变量。

常用于节省内存,以及操作系统数据结构或硬件数据结构。

6、枚举:

C++的enum工具提供了一种创建符号常量的方式,这种方式可以替代const。

对于枚举,只定义了赋值运算符,没有定义算术运算。

枚举量是整型,可被提升为int类型,但是int类型不能自动转换为枚举类型。

6.1 设置枚举量的值

first默认情况下是0,后面没有被初始化的枚举量的值默认比前面的值大1。

6.2 枚举的取值范围

找出大于最大值的最小的2的幂,将它减去1,得到取值范围的上限。
如果枚举量的最小值不小于0,则取值范围的下限为0;否则,采用寻找上限的方式,但要加个负号。

7、指针和自由存储空间:

*运算符被称为间接值或者解除引用运算符。

7.1 声明和初始化指针

*运算符两边的空格是可选的。

对每个指针变量名,都需要使用一个 *。

可以在声明语句中初始化指针,被初始化的是指针,不是它指向的值。

7.2 指针的危险

解引用之前必须要初始化!!!

7.3 指针和数字

不能简单地将整数赋给指针,即使是地址也不行,但可以强制转换。

7.4 使用new来分配内存

typeName * pointer_name = new typrname;

7.5 使用delete释放内存

只释放内存,不释放指针。

不要释放已经释放的内存块。
不要用两个指针指向同一个内存块。

7.6 使用new来创建动态数组

使用new和delete的规则:
不要使用delete来释放不是new分配的内存。
不要使用delete释放用一个内存块两次
如果使用new[]为数组分配内存,则应使用delete[]来释放。
如果使用new为一个实体分配内存,则应使用delete来释放。
对空指针应用delete是安全的。

8、指针、数组和指针算术:

8.1 程序说明

C++将数组名解释为数组第一个元素的地址。

很多情况下,可以使用相同的方式使用指针名和数组名。
对于他们,可以使用数组方括号表示法,也可以使用解除引用运算符。
区别之一的是,可以修改指针的值,而数组名是常量。

8.2 指针小结

不赋初值时,是随机初始化。

8.3 指针和字符串

cout对象认为char的地址是字符串的地址,因此它打印该地址处的字符,然后继续打印后面的字符,直到遇到空字符为止。

8.4 使用new创建动态结构

->运算符可用于指向结构的指针,就像点运算符可用于结构名一样。

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

自动存储的内存用完即释放。

9、类型组合:

本章介绍了数组、结构和指针,可以用各种方式组合它们。

10、数组的替代品:

10.1 模板类vector

vactor < typename> vt(n_elem);
初始长度为0,初始值为0.

10.2 模板类array(C++11)

array < typename,n_elem> arr;
初始值任意,可以用“=”进行数组赋值。

10.3 比较数组、vector对象和array对象

可以使用at()避免数组越界,但是效率会降低。

11、总结:

数组、结构和指针是C++的3种复合类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值