C++笔记5

结构简介

假设要储存有关篮球运动员的信息,则需要储存他的姓名,工资,身高,体重,平均得分,命中率,助攻次数。希望有一种数据格式可以讲所有这些信息储存在一个单元中。数组不完成这项任务,因为虽然数组可以储存多个元素,但所有元素的类型必须相同。也就是说,一个数组可以存储20 int,另外一个数组可以 存储 10 个 float,但同一个数组不能在一些元素中存储 int,在另一些元素中存储 float。

C++结构可以满足要求,结构是一种比数组更加灵活的数据格式,因为同一个结构可以存储多种类型的数据,这使得篮球运动云的信息放在一个结构中,从而将数据的表示合并在一起,如果要跟踪整个球队,则可以使用结构数组,结构也是C++类的基础。

结构是用户定义的类型,而结构声明定义了这种类型的数据属性。定义了类型之后,就可以创建这种类型的变量。因此创建结构包括2步,首先,定义结构描述,他描述并标记了能够存储在结构中的各种数据类型,然后按照描述创建结构变量

定义了结构之后,就可以创建这种类型的变量 了

并且可以使用成员运算符.来访问各个成员

在程序中使用结构

4.11 structur.cpp // structur. cpp a simple structure *include eiostream> struct inflatable // Structure declaration char name [201 ; float volume; double price; int main ( ) using namespace std; inflatable guest “Glorious Gloria” , 1.88, 29.99 // name value // volume value // price value ; // guest is a structure variable of type inflatable // It’s initialized to the indicated values inflatable pal “Audacious Arthur n , 3.12, 32.99 // pal is a second variable of type inflatable // NOTE: some implementations require using // static inflatable guest = cout “Expand your guest list with guest . name; cout / / pal name cout cout and pal.name n is the name member of the pal variable “You can have both for S”; guest .price + pal.price ! \n”; return O Expand your guest list with Glorious Gloria and Audacious Arthur! You can have both for $62 . 98! 结构的声明位置是很重要的,可以将声明放在 main()函数中,紧跟在开始括号的后面,另一种选择是放在 main()前面,这里就是采用的这种形式,位于函数外面的声明称为外部声明,对于这个程序来说,两种选择之间没有实际区别,但是对于包含俩个活多个函数的程序来说,差别很大,外部声明可以被后面的任何函数使用,而内部声明只能被该函数使用。

同理而言,对于变量也是这样

接下来我们注意初始化的方式

和数组一样,使用逗号分隔符分隔值列表,并将这些值哦那个花括号括起来,可以每个值占一行,也可以放在一行。

C++结构初始化

和数组一样,C++也支持将列表初始化用于结构,并且也是 =可选

其次,如果大括号未包含任何东西,每个字节被设置为0。

结构可以使用 string 类为对象嘛: da答案是肯定的

但是一定要结构定义能够访问 std,将 using namespace std;

放到结构定义之前

其他结构属性

C++使用用户定义的类型和内置的类型相识,例如

可以将结构作为参数传递给函数,也可以让函数返回一个结构,还可以使用 =赋值,即使结构成员为数组。

结构数组

也可以创建元素为结构的数组

方法基本上和创建普通数组一样

结构中的位字段:

和C语言一样,C++也允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便,字段的类型位整型或者枚举,接下来是冒号,冒号后面是一个数字,他指定了使用的位数。

共用体

共用体是一种数据格式,它能够储存不同的数据类型,但同时只能存储其中一种类型,

共用体一次只能存储一个数据,因此可以来节省空间

通用体基本上是用来节省内存的。所以常用于操作系统数据结构或硬件数据结构

枚举体

C++的 enum工具 提供了另外一种创建符号常量的方法

使用enum 的语法和使用结构相似。

这条语句完成两种工作

1.让 spectrum 成为新类型的名称,叫做枚举

2.将 括号内容作为符号常量,依次对用0到7

指针和自由存储空间:

指针是一个变量

他存储的值的地址,而不是值本身

对于常规变量我们只需要使用 &就可以获得地址了 4.14 address.cpp // address.cpp using the & operator to find addresses #include < iostream> int main() using namespace std; int donuts = 6 double cups = 4.5; cout “donuts value = donuts; cout “ and donuts address = “ ‘donuts endl; / 1” NOTE: you may need to use unsigned (&donutg) // and unsigned ( &cups) cout “cups value = cups; Cout and Cups address &cups endl; return O; 显示地址的时候,实现的是16进制表示法,因为这是常用于描述内存的表示法

指针和C++原理

面向对象编程和传统编程的区别在于,OOP强调的是在运行阶段,而不是在编译阶段进行决策,运行阶段指的是程序正在运行时,编译阶段是编译器见程序组合起来的时候,运行阶段决策就好比度假时,选择参观那些景点取决于当时的天气和心情,但是编译阶段更像是不管是在什么条件,都坚持预先设定好的日程安排。

运行阶段提供了灵活性,可以根据当时的情况进行调整。例如,考虑为数组分配内存的情况,传统方法是申明一个数组,要在 C++中声明数组,必须指定数组的长度。因此,数组的长度在程序编译时就设定好了,这就是编译阶段决策。但是如果你将数组的大小设置得过大或者过小都是不合适得。

总之,使用 OOP时,宁可能在运行阶段确定数组得长度,为使用这种方法,语言必须允许在程序运行时创建数组,C++采用得方法是,使用关键字new请求正确数量得内存,以及使用指针来跟踪新分配的内存得位置

处理存储数据得新策略则是刚好相反,将地址视为指定得量,而将值视为派生量,一种特殊类型得变量-指针用于储存值得地址,因此指针名代表得是地址,*运算符被称为间接值运算符,将其应用于指针,可以到到地址存储的值。

4.15 pointer.cpp // pointer. cpp our first pointer variable #include int main() using namespace std i int updates = 6 int * p updates; p_updates = &updates; / i” express values two ways // declare a variable // declare pointer to an int // assign address of int to pointer cout “Va1ues: updates = updates; updates endl; Cout / / express address two ways cout “Addresses: &updateg = &updateg; cout , p_updates “ p_updates endl; // use pointer to change value updates = cout “NOW updates “ updates endl; return O; 声明和初始话指针:

这里我们可以理解为 p_updates 为指针,也就是地址

但是 *p_updates 为int

指针的危险

C++创建指针的时候,计算机将分配用来存储地址的内存,但不会分配存储指针所指向的数据的内存

指针和数字:

指针不是整型,虽然计算机通常把地址当作是整数来处理,但从概念上来讲,指针和整数时截然不同的类型,整数时可以执行加减乘除的数字,而指针描述的时位置,将两个地址相乘没有任何的意义。

使用 new来分配内存

Int *pn= new int,

内存耗尽问题

计算机可能会由于没有足够内存而无法满足 new的请求,在这种情况下,new 通常会引发异常,就会返回一个空指针

使用 delete 来释放内存

当需要内存时,可以使用 new来请求,这只是 C++内存管理数据包中有魅力的一个方面,另外一个方面则是 delete,后面加上指针。

只能使用 delete 释放 new分配的内存

使用new来创建动态数组

在创建的时候,我们需要什么类型的数组,就在new 后面加上需要的类型数组的形式,但是我们在 delete 的时候,需要 加上括号,这代表了时释放整个数组,因为不加括号的指针是数组第一个元素的地址。

使用new来创建动态数组

在创建的时候,我们需要什么类型的数组,就在new 后面加上需要的类型数组的形式,但是我们在 delete 的时候,需要 加上括号,这代表了时释放整个数组,因为不加括号的指针是数组第一个元素的地址。

使用动态数组

只需要将指针当作数组名称使用即可,可以这样做的原因是C和C++内部都是使用指针来处理数组的,数组和指针等价是C和C++的优点之一。

4.18 arraynew.cpp / 1” arraynew.cpp using the new operator for arrays

include

int main ( ) using namespace std; double p3 = new double (31; // p3 [01 P3(1) “P3 [1 | is cout p3 p3 “Now p3 (01 cout “p3 [1] is cout p3 p3 - 1 delete [ ] p3 ; return 0; space for 3 doubles treat p3 like an array name increment the pointer o: and point back to beginning free the memory 这里我们通过指针来操作了数组

但是我们也能看出指针和数组的根本区别就在于

指针是变量,但是数组不是,

指针 的值可以改变

Written on November 26, 2019