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

简介: 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。

可以使用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(成员位置)捕获非法索引。

相关文章
|
3月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
41 11
|
4月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
5月前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
122 0
|
6月前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
45 6
|
6月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
98 12
|
6月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector&lt;std::shared_ptr&lt;int&gt;&gt;;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
98 5
|
5月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
58 0
|
5月前
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
46 0
|
6月前
|
C++ 开发者
C++一分钟之-概念(concepts):C++20的类型约束
【7月更文挑战第4天】C++20引入了Concepts,提升模板编程的类型约束和可读性。概念定义了模板参数需遵循的规则。常见问题包括过度约束、约束不完整和重载决议复杂性。避免问题的关键在于适度约束、全面覆盖约束条件和理解重载决议。示例展示了如何用Concepts限制模板函数接受的类型。概念将增强模板的安全性和灵活性,但需谨慎使用以防止错误。随着C++的发展,Concepts将成为必备工具。
125 2
|
7月前
|
编译器 程序员 语音技术
C++的超20种函数类型分享
C++超20种函数类型:编程语言规定规则,编译器实现预定规则