c++primer plus 6 读书笔记 第四章 复合类型

第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

可以使用cincout

可以使用数组表示法 访问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 stringI/O

cin 和从cout可用于string类的输入输出。

使用getline(cin.str)读取行。

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

除了char类型,C++还有wchar_t, char16_t,char32_t.

使用LuU前缀表示。

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 声明和初始化指针。

指针声明必须指定指针指向的数据类型。

Eint * p_updates;

传统上 C程序员使用这种格式:

int  *ptr;//强调*ptrint类型的值

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;

一定要配对使用newdelete!(newdelete一一对应)

4.7.6 使用new来创建动态数组

1.使用new创建动态数组

只要将数组的元素类型和元素数目告诉new即可。

E:

int* psome = new int p[10];

new将返回第一个元素的地址。

释放动态数组内存:

delete [] some;

 

使用newdelete的需要遵循的规则:

不要使用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. 访问其成员

不能用.访问,因为没有名称,

只能用->运算符访问。

Eps->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数组的替代品

模板类vectorarray是数组的替代品

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数组、vectorarray

vectorarray可以使用.at(成员位置)捕获非法索引。

猜你喜欢

转载自blog.csdn.net/qq_41068877/article/details/80950488