目录
4.1.3C ++数组初始化方法使用{} 赋值,禁止缩窄转换。
4.4.1 结构声明通常放在函数外部,可以被后面的函数共用。
4.8.5 自动存储、静态存储、动态存储(C++管理内存的3种方式)
第4章复合类型
4.1 数组
数组( array )是一种数据格式,存储多个同类型的值。
数组声明包括:
存储在每个元素中的值的类型;
数组名;
数组中的元素数。
声明数组的通用格式如下:
typeName arrayName [arraySize];
ARRAYSIZE 不能是变量。
使用下标访问数组元素(从 0 开始),如个月[0] 是个数组的第一个元素。
4.1.1
4.1.2 数组的初始化规则
只有定义时才能初始化数组,不能用一个数组给另一个数组赋值。
然而可以使用下标单个赋值。
4.1.3C ++数组初始化方法使用{} 赋值,禁止缩窄转换。
4.2 字符串
字符串是存储在内存的连续字节中的一系列字符。
C ++ 提供两种处理字符串的方式。
C- 风格字符串 状语从句:串类。
D- 风格字符串:使用炭数组,以空字符 '\ 0'结尾。
使用字符串常量( string constant )或字符串字面值(string literal )来初始化字符数组。
E:char fish[] = “Bubbles”;
这种方法不需要显式地包括结尾的空字符。(自动添加)
4.2.1 拼接字符串常量
C++允许拼接字符串字面值,即 将两个用引号括起的字符串合并为一个。
E:cout<<”I’d give my right arm to be” “a geat violinist.\n”;
4.2.2 在数组中使用字符串
存储字符串到数组的常用方法有两种:
将数组初始化为字符串常量、从键盘或文件输入并且读入到数组中。
4.2.3 字符串输入
4.2.4 每次读取一行字符串输入
1.面向行的输入:getline()
cin.getline(数组名称,读取字符数)
2. 面向行的输入:get()
cin.get(数组名称,读取字符数)
但是get不再读取并丢弃换行符。而是保留在队列中。
因此,通常使用cin.get(name,ArSize).get() 来读取换行。
4.2.5 混合输入字符串和数字
4.3 string类简介
string类提供一种比数字简单的存储字符串方式。
使用string类需要头文件string,名称空间std。
可以使用C-风格字符串来初始化string。
可以使用cin、cout
可以使用数组表示法 访问string对象中的字符。
4.3.1C++字符串初始化
4.3.2 赋值、拼接和附加
string 可以直接使用= ,将一个字符串赋值给另一个字符串。
使用+可以将两个string拼接起来。
.size()返回大小。
4.3.3 string类的其他操作。
对于C-风格字符串,使用C语言库函数处理。
头文件cstring。
strcpy(字符串1,字符串2)
strcat(字符串1,字符串2)
strlen()
4.3.4 string类I/O
cin 和从cout可用于string类的输入输出。
使用getline(cin.str)读取行。
4.3.5其他形式的字符串字面值
除了char类型,C++还有wchar_t, char16_t,char32_t.
使用L、u和U前缀表示。
E:wchar_t title[] = L”Chief Astrogator”;
char16_t name[] = u”Felonia Ripova”;
char32_t car[] = U”Humber Super Snipe”;
原始字符串,输入原始字符串。
R”(字符串内容)”
R”+*( )+*”;
4.4结构简介
结构是一种比数组更加灵活的数据格式。
一个结构可以存储多种类型的数据。
一个结构体包含多个成员,使用.运算符访问成员。
创建结构分为两步:
1. 定义结构描述
2. 创建结构变量
E结构声明:
struct inflatable
{
char name[20];
float volume;
double price;
};
4.4.1 结构声明通常放在函数外部,可以被后面的函数共用。
4.4.2 C++11结构初始化 支持列表初始化。
E: inflatable duck {“Daphne”, 0.12, 9.98};
4.4.3结构可以将string类作为成员
4.4.4 其他结构属性
与C++内置的数据类型有很多相同的属性。
可以作为函数参数,返回值,
=赋值(即使成员是数组),
4.4.5 结构数组
结构体作为基本元素构成数组。
inflatable gifts[100];
4.4.6结构中的位字段
字段的类型是整型或枚举,然后是:然后是数字(位数)
struct torgle_register
{
unsigned int SN : 4;
unsigned int :4;
bool goodIn : 1;
bool goodTorgle :1;
};
4.5公用体(union)
union是一种数据类型,能够存储不同类型数据,但同时只能存储一个。语法与结构体(struct)类似。
4.6 枚举(enum)
提供了一种创建符号常量的方式。
E:enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
4.6.1 设置枚举量的值
赋值运算符显式设置值(只能是整数)
E:enum bits {one =1, two =2, four =4, eight = 8}
4.6.2 枚举的取值范围
4.7 指针和自由存储空间
指针用于存储地址。
指针名表示的是地址,
*间接运算符 用于指针 可以得到指针所指地址的值。
4.7.1 声明和初始化指针。
指针声明必须指定指针指向的数据类型。
E: int * p_updates;
传统上 C程序员使用这种格式:
int *ptr;//强调*ptr是int类型的值
C++程序员使用这种格式
int* ptr; //强调int* 是一种类型--指向int的指针。
初始化指针:
E:
int higgens =5;
int* pt = &higgens;
4.7.2指针的危险
指针如果指向一个不确定的地址,会发生危险,导致未知错误。
因此,一定要在对指针使用解除引用运算符*之前,将指针初始化为一个确定的、适当的地址。!!!
4.7.3指针和数字
指针不是整型,它是描述地址的整数。两个地址相乘除没有意义。
4.7.4 使用new来分配内存
指针真正的用武之地在于,在运行阶段分配为命名的内存以存储值。
在C语言中,可以使用库函数malloc()来分配内存,C++也可以,但是C++有更好的方法 new运算符。
需要告诉new,要为那种数据类型分配内存,new找到一个合适的内存块,然后返回该内存的地址。
E: int* pn = new int;
通用格式:
typeName* pointer_name = new typeName;
4.7.5 使用delete释放内存
使用完内存后,将内存返还给内存池。
使用delete,后面加上指向内存块的指针。
int* ps = new int;
...
delete ps;
一定要配对使用new和delete!(new和delete一一对应)
4.7.6 使用new来创建动态数组
1.使用new来创建动态数组
只要将数组的元素类型和元素数目告诉new即可。
E:
int* psome = new int p[10];
new将返回第一个元素的地址。
释放动态数组内存:
delete [] some;
使用new和delete的需要遵循的规则:
不要使用delete释放不是new分配的内存;
不要使用delete释放同一个内存块两次;
使用new []对应 delete []
2.使用动态数组
只要将指针当作数组名即可。
4.8 指针、数组和指针算数
C++数组名为第1个元素的地址,
而数组表达式 stacks[1] 在C++编译器中是*(stacks+1),
很多情况下,可以用相同的方式使用指针和数组名。
区别是,指针的值可以修改,数组名是常量。
对数组用sizeof得到数组长度,对指针用得到指针的长度。
4.8.1程序说明
4.8.2指针小结
4.8.3指针和字符串
数组和指针的关系可以扩展到C风格的字符串。
给cout提供一个字符的地址将打印到空字符。
4.8.4 使用new创建动态结构
1.创建结构
E:inflatable* ps = new inflatable;
3. 访问其成员
不能用.访问,因为没有名称,
只能用->运算符访问。
E:ps->price;
或者
(*ps).price
4.8.5 自动存储、静态存储、动态存储(C++管理内存的3种方式)
1.自动存储
在函数内部定义的常规变量使用自动存储空间,被称为自动变量。
实际上,自动变量是局部变量。
2.静态存储
静态存储是整个程序执行期间都存在的存储方式。
使变量变成静态变量的方式有2种:
1. 在函数外面定义
2. 声明变量时使用关键字static 。E:static double fee =56.20;
3. 动态存储
new 和delete提供一种灵活的方法。它们管理了一个内存池。在C++中称为自由存储空间或堆。该内存池与上述的两种方式管理的内存是分开的。
4.9 类型组合。
数组,结构,指针之间可以进行各种方式的组合。
4.10数组的替代品
模板类vector和array是数组的替代品
4.10.1模板类vector
模板类vector类似于string类,是一种动态数组。
首先,使用vector对象需要包含头文件vector,其次,vector包含在名称空间std中,
第三,模块使用不同的语法指出它存储的数据类型,
第四,vector类使用不同语法指定元素数。
vector<typeName> vt(n_elem);
n_elem可以是变量或常量整型。
4.10.2 模板类array
array同数组一样,长度固定。头文件array,名称空间std.
声明 array<typeName,n_elem> arr;
4.10.3数组、vector、array
vector和array可以使用.at(成员位置)捕获非法索引。