《Cpp-Primer-Plus》-第四章 复合类型

141 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

第四章 复合类型

博客地址
本文记录CCPlus第四章学习

知识整理

​ c++有三种复合类型:数组,结构和指针。

​ 数组已经很熟悉了,用于存储相同类型的数据列表,通过索引和下标,可以访问各个元素。需要注意的是,c++数组只有在定义的时候才能使用初始化,即int nums[2] = {3, 8},而不能nums[2] = {2, 7},同时不能将一整个数组赋值给另外一个数组。

​ 数组还包括字符串数组,即char数组。需要注意的是,若char数组结果为\0,即空字符,则可表示字符串。对字符串数组输入时,cin只能一次输入一个单词,这时要使用cin.get()cin.getline()两个函数,要弄清楚两个函数的区别。get()函数遇到换行符时,会取消输入,但会将换行符留在输入序列中,这会造成一些问题,而getline()函数会将换行符从输入序列中剔除。两者使用要看具体情况。

​ 对于字符串,c++还有string对象,可以简化很多对字符串的操作,非常方便使用。

​ sizeof用于数组名,得到的是整个数组的字节数,而不是单个元素的字节数。

​ 结构同样也是很实用的一种复合类型,再同一个结构中可以存储不同类型的数据,要使用结构,需先定义结构,下面为书中定义结构描述的例子:

struct inflatable{
	char name[20];
	float volume;
	double price;
}

​ 然后就可以使用结构,结构使用时就像基础类型,可以有结构数组,结构赋值等,非常方便,如下

inflatable hat;
inflatable gifts[100];

​ c++中还有一种共用体类型,与结构类似,可以存储不同的数据类型,但同时只能存储其中的一种。这种结构还是头一次了解到,其声明如下:

union on4all{
	int int_val;
	long lon_val;
	double double_val;
}

one4all pail;

​ 它在某一时刻可以为int类型,在某一时刻可以为double类型,只需要赋值即可,不需要关注它怎么换类型,但它的主要优点是可以节省内存,它的长度为最大成员的长度。

​ 接下来就是枚举类型,这个类型还是听过,用过的,但用的不多,声明如下

enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

spectrum band;

​ 里面的red等称为符号常量,在枚举中,它们都对应一个整数值,于是可以直接将符号赋值给枚举变量,在java开发中,枚举主要用来限制变量范围以及便于明确变量业务赋值,因为字符比整型容易辨认。

​ 枚举的枚举值不一定需要存在,但要在枚举定义的取值范围内,范围上限则是大于最大值的2的幂减一,如最大值是101,则上限为127,要计算下限,则看最小值。最小值大于0,下限就为0,若小于0,下限就是小于该负值的2的幂加1。如最小值为-6,则下限为-7。

​ 最后就是指针。指针是c与c++一个非常重要,并且非常难的一个概念。指针表示的不是值,而是一个地址。

int * p_updates;

​ p_updates为指针名,指向地址。*为解引用符,*p_updates指向该地址内的值。使用指针会遇到很多的危险,一定要在对指针应用接触引用符号之前,将指针初始化一个确定的,适当的地址,不能直接将一个整型赋值给指针。如果要赋值的话,需将正确整型地址通过强制类型转换将数字转换为适当的地址类型。

int * pt;
pt = (int *) 0xB80000000;

​ 指针除了静态分配地址,还可以使用new运算符为其动态分配地址,但要注意使用delete删除内存

int * pn = new int;

delete pn;

​ new与delete必须配对使用,不能漏删,少删,重复删除,这样会出现意想不到的错误。

​ 使用动态指针还可以创建动态数组

int * psome = new int [10];

delete [] psome

psome是一个指向int的指针,即数组的第一个元素,psome = psome + 1可以吧指针指向第二个元素,指针+1是将指针指向下一个元素的地址,即在psome数组中是地址+4。

​ c++有三种管理数据内存的方式:自动存储,静态存储和动态存储。

​ 自动存储即在函数内部定义变量使用的自动存储空间,该变量为自动变量。作用域在函数内,随函数消亡而消亡。自动变量存储在栈内。

​ 静态存储是整个程序执行期间都存在的存储方式。有两种声明静态变量的方式:在函数定义,以及使用关键字static

​ 动态存储称为自由存储空间或堆,new与delete运算符相关的变量即为动态变量,它们能够在一个函数中分配内存,在另一个函数中释放,变量的生命不完全受程序或函数的生存时间控制。

复习题

  1. 如何声明下列数据?

    1. actor是由30个char组成的数组。

      char actor[30];
      
    2. betsize是由100个short组成的数组

      short betsize[100];
      
  2. 下面的代码是否有效?如果有效,它将打印出什么结果?

    cout<<(int *)"Home of the jolly bytes";
    

    有效,表达式"Home of the jolly bytes"为字符常量,该语句打印出字符串的地址。

  3. 声明一个vector对象和一个array对象,都包含10个 string对象。指出所需的头文件,但不使用using。使用const来指定要包含的string对象数。

    #include<iostream>
    #include<string>
    #include<vector>
    #include<array>
    const int strLen = 10;
    std::vector<str::string> vec(strLen);
    std::array(std::string, strLen) arr;