C++复合类型(一)

来源:互联网 发布:九九乘法表c语言倒 编辑:程序博客网 时间:2024/04/29 17:15

复合类型是基于基本类型的一种类型,因此它比基本类型复杂是必然的。它由相同或不同种基本类型有机叠加组合而成或者是基本类型的衍生物,包括数组、字符串、结构、共用体和指针。

1 st 数组

数组是同一种基本类型叠加体。如果把基本类型比喻成一节节不同型号的高铁车厢,那么数组就是一辆正常普通的高铁(一辆由很多节相同型号的车厢连接而成的列车)。但是车厢的编号切记是从0而不是1开始的。

(以下皆以基本类型int为例)

例如: int cookie_box[10];//This is an arrray which consist with ten variables whose type is int. cookie_box[0] is the first one.

 

#定义(identification

(1)    int cookie_box[78];//We have 78 boxes of cookies,and the first box is called cookie_box[0];

(2)    Int cookie_box[]={5,4,0,8,6};//We have 5 boxes of cookies.And from then on,we must and  can only have 5 boxes.

“【】”和“{}”不能同时为空。

 

#初始化(initialization

(1)    int cookie_box[8]={3,5,2,4,1,0,2,2};//All of the eight elements are initialized.

 

(2)  int cookie_box[8]={3,5};//Only the first two elements are initialized by the programmer,and the others are initialized to 0 by the machine.

 

(3)    int cookie_box[8]={};//All are initialized to 0 by the machine.

 

(4)    int cookie_box[8]={0};//All are initialized to 0 by the machine.

 

(5)    int cookie_box[8]={1};//All are initialized to 0 by the machine,except the first one which is initialized to 1 by the programmer.

列表初始化赋值禁止缩窄转换。C++11标准中可以省略“=”。

 

#使用

(1)  数组名实际上是一个地址。所以,使用std::cout时,“std::cout<<cooki_box”输出的是地址。它是整个数组的地址,但是和数组中的一个元素的地址(既下标为0的元素地址)数值上相同。

这里就要注意了,虽然地址数值上相同,但是不代表cookie_boxcookie_box[0]完全等价可以互换。当使用sizeof的时候:如果是sizeof(cookie_box),则得到的是整个数组的长度(既整个数组所有元素加起来所占用的总字节数,单位是byte(s));如果是sizeof(cookie[0])则得到的是数组中一个元素的长度。在这里的话,一个int元素在32位机中是占8bytes,在64位机中占16bytes。这个点在本复习稿的最后一个复合类型介绍中下会再次详细强调。

(2)  编译器不会检查下标是否越界,但是程序运行后可能会出错。

(3)  当程序员可以不已知数组的大小的时候,可以考虑让编译器去数个数,虽说这样如果程序员自己打错了编译器无法发现。

例子:

int cookie_box[]={0,1,2,3,4,5,6,7,8,9};

Int len=sizeof cookie_box/ sizeof(int);

 

#动态数组vector模板类

(1)可以在运行阶段设置vector对象的长度,添加或插入新数据。原因:vector自动采用newdelete来管理内存。

(2)使用:1,头文件:#include<vector>

2,使用using编译指令、using声明或std::vector

原因:vector在名称空间std之中。

3,声明数据类型的语法很特殊

 vector<int>  cookie_box;

 vector<int>  cookie_box(27);

 int a;

cin>>a;

vector<int> cookie_box(a);

vector<int>cookie_box(3,)

4,使用不同的语法指定元素数

因为它会顺着插入或添加而自动调节长度,所以可以将初始长度设置为零。

5vector功能强大方便安全,但是以降低效率作为代价。如果需要的数组长度固定使用数组更好。

6C++98中不能对vector对象列表初始化。

 

#C++11新增模板类array

(1)array的长度和数组一样是固定的,更安全方便。原因:它的诞生是为了解决使用相对vector而言更高效的数组时的方便和安全问题。它和数组一样使用栈(静态内存分配),而不是自由存储区,所以效率与数组相同。

(2)使用:1,头文件:#include<array>

2array也在名称空间std里。

3,声明数据类型的语法很特殊

l array<int,5>  cookie_box;

l array<int,4>  cookie_box={34,564,324,57};

4,数组个数的设置不能是变量(数组和vector都可以是变量)。

5C++11可以将vectorarray列表初始化。

 

PS:C++的内存布局:

 堆:C语言和操作系统的术语。是操作系统维护的一块动态分内存。

 栈:由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储 区。包括局部变量、函数参数等。

 自由存储区域:指由newdelete来管理的一块内存(一个抽象概念, 实际上区别于栈,是堆)

 常量存储区:里面存放的是常量,正常情况下不允许修改

 全局/静态存储区:全局变量和静态变量被分配到该内存区域中

从表示方面分析,不管是数组还是vector还是array都可以使用标准数组表示法来访问各个元素。

从地址方面分析,数组和array都在栈中,而vector在自由存储区中(不同于栈)。

从使用方面分析,可以将一个两个array对象之间可以直接用一个等于号完成复制,但是数组要逐一复制。

 

#越界保护措施

使用vectorarray的成员函数at()可以在运行期间捕获非法引索(越界)。但是要以运行时间更长作为代价。

 array<int,5>  cookie_box1;

vector<int,4>  cookie_box2={34,564,324,57};

 cookie_box1.at(2)=6.7;

 cookie_box2.at(1)=3.4

成员函数begin()end()也可以确定边界避免越界。(begin()end()的用法将会另行给出)

By little_small_joze and Katlynn 网络加速 kiwimini.net
原创粉丝点击