C++ Primer Plus 学习笔记
第四章 下半
结构
结构的描述
struct structName
{
memberType memberName1;
memberType memberName2;
}
结构的声明及初始化
structName variableName; // C++特有
struct structName variableName; // C支持
// 结构初始化
structName variableName =
{
memberValue1,
memberValue2
};
// C++11允许
structName variableName {memberValue1, memberValue2};
structName variableName {}; // 所有成员被设置为零
结构体的初始化同样不允许缩窄转换,也可以将string
类作为成员。
可以使用=
将结构体的值赋给另一个同结构的结构体变量。结构体同样可以作为数组
结构体成员的访问
structName.variabelName
共用体
使用关键字union
作为共用体的标识,其描述结构、声明、初始化以及成员的访问的语法均和结构体类似。
共用体与结构体的不同之处在于,共用体只能同时储存一个成员。因此,共用体的长度是它的最大成员的长度。
所以,共用体可以一会儿是int型,一会儿是double型。
枚举
使用关键字enum
作为枚举的表示,使用方式和结构体类似,如下
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
其中,red
等作为枚举量,对应的数值为0~7,作为一种符号常量存在。可以将其作为一个常量,赋给一个变量,但不允许进行运算。
可以在定义时,特别地指定枚举量的值,如enum spectrum {red = 3, yellow};
。值得注意的是没有初始化的枚举量的值将比前面的大1。同时,也可以创建多个值相同的枚举量。
也可以对一些整型进行强制转换,只要他的值在枚举的范围内。
指针
C++中的指针表示和C语言一样,同样使用&
作为地址运算符,*
作为解引用运算符。
其初始化格式为,如下
int *p1, *p2; // 两个指向int的指针
int *p1, p2; // 一个指向int的指针(p1)和一个int变量(p2)
int *pt = &higgens; // 将pt的值设置为higgens的地址
在对一个指针使用接引用*
之前,必须确保该指针指向一个明确的地址。
指针和数组的关系
*(pt + 1) = pt[2]
pt = &pt[0]
使用指针访问结构成员时,需要使用->
而不是.
。
分配内存
C++可以使用new
运算符来分配内存。通用的格式为typeName * pointer_name = new typeName;
。
可以使用delete
运算符来释放new
所分配的内存,格式为delete pointer_name;
。**
创建和释放动态数组
short * ps = new short [500];
delete [] ps;
new和delete必须配套使用,应注意:
- 不要使用
delete
来释放不是new
分配的内存。 - 不要使用
delete
释放同一个内存块两次。 - 如果使用
new[]
为数组分配内存,则应使用delete[]
来释放。 - 如果使用
new
为一个实体分配内存,则应使用delete
(没有方括号)来释放。 - 对空指针使用
delete
是安全的。
数组的替代品
模板类vector
是一种动态数组,使用它必须包含头文件vector
,同时它也在名称空间std
中。
C++11添加了模板类array
来替代定长数组,使用它必须包含头文件array
,同时它也在名称空间std
中。