栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

第4章 复合类型-1

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第4章 复合类型-1

本章包含知识点:  数组  C风格字符串  string类字符串  getline()和get()读取字符串  混合输入字符串和数组  结构  共用体  枚举  指针  关键字new和delete  动态数组  动态结构  自动存储、静态存储、动态存储  vector和array

本章将介绍所有以上复合类型,new和delete以及如何使用它们来管理数据。除此,还将简要地介绍string类——另一种处理字符串的途径。

4.1 数组

数组(array)是一种数据格式,能够存储多个同类型的值。
数组声明必须包含三点:
 类型(int or double or others…)
 数组名
 元素个数
语法格式:

typeName arrayName[arraySize]
//例如:
short months[12];
int yams[2] = {20, 30} 

arraySize为指定元素个数,必须为整形常数或const值或常量表达式(8*sizeof(int)),不能为变量。
注意:编译器不会检查使用的下标是否有效,即如果将一个值赋给不存在的元素months[110],编译器也不会指出错误,但是程序运行后,赋值可能引发问题,破坏数据或代码,也可能导致程序异常终止。所以必须确保程序使用有效的下标值。

4.1.2 数组的初始化规则

1、 初始化只能在定义数组时使用,不能将一个数组直接赋给另一个数组;

int cards = {2, 3, 5};   //allowed
int hand[3];    // allowed
hand[3] = {2, 3, 5};   //not allowed
hand = cards;      //not allowed

2、初始化数组时,提供的值可以少于数组的元素个数(其他元素默认设置为0);
3、初始化时内[]为空,C++编译器会自动计算元素个数。编译器将使hand数组包含3个元素。(不推荐)

int hand[] = {2, 3, 5};
4.1.3 C++数组初始化方法

C++11将大括号的初始化(列表初始化)作为一种通用初始化方式,可用于所有类型。
1、 初始化数组时,可省略“ = ”;

int hand [3] {2, 3, 5};

2、 大括号内可为空,将把所有元素设置为0;
3、禁止缩窄转化。

long plif[] = {24, 93, 3.0};     //not allowed,浮点数转换为整形为缩窄
char slifs[4] {‘h’, ‘i’, 1122011, ‘’};    //not allowed,1122011//超出了char变量的取值范围(假设char变量长度为8位)
char tlifs[4] {‘h’, ‘i’, 112, ‘’};     // allowed,112在char变量范围内
4.2 字符串

字符串是存储在内存的连续字节中的一系列字符。
C++处理字符串方式有两种:

  1. C-风格字符串(c-style string)
  2. 基于string类库
    C-风格字符串以空字符()结尾,其ASCII码为0,用来标记字符串的结尾。
char dog[2] = {‘a’, ‘b’ };   //not a string
char dog[2] = {‘a’, ‘’};  // a string

字符串常量:只需使用一个用引号括起来的字符串即可初始化字符数组为字符串。

char bird[11] = {“Mr.Cheeps”};

用双引号括起来的字符串隐式地包括结尾的空字符。
注意:字符串常量(双引号)和字符常量(单引号)不能互换。

char shirt = ‘S’;        //ok
char shirt = “S”;      //illegal,”S”表示两个字符(S和),实际上表示字符串所在地址
4.3 string类简介

使用string类,必须包含头文件string,string类位于名称空间std中。

#include 
using namespace std;

使用string对象方式和使用字符数组相同:
 可使用C-风格字符串来初始化string对象
 可使用cin来读取键盘输入存储到string对象,cout显示对象
 可使用数组表示法访问string对象中的字符
string对象和字符数组的主要区别:可以将string对象声明为简单变量而非数组。

string str1;
string str2 = “dog”;

类设计使得程序可以自动处理string的大小,比如初始化长度为0的string对象会根据程序该string对象的赋值操作时自动调整其长度。

4.3.2 赋值、拼接和附加

C-风格字符串,头文件cstring提供函数,比如strcpy();
String类可直接将一个string对象赋值给另一个string对象;可使用运算符+=将字符串附加到string对象的末尾,或直街通过=判断相等。

4.4 结构简介

结构是一种比数组更为灵活的数据格式,可以存储多种类型的数据。
结构时用户定义的类型,结构声明定义该类型的数据属性。创建结构包括2步:1)定义结构描述-描述并标记能够存储在结构中的各种数据类型;2)按描述创建结构变量。
例如:

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


关键字struct表明,这是一个结构。标识符inflatable是这种数据格式的名称,即新类型的名称为inflatable。
创建inflatable变量:

inflatable hat;
hat.price;  //可以使用(.)运算符来访问结构中的成员,返回会定义时的double类型
hat.name;  //为一个char数组
4.4.1 在程序中使用结构

结构声明的位置:

提倡使用外部结构声明。

4.4.2 C++11结构初始化

1、支持列表初始化,且“ = ”为可选项;
2、 如果{}为空,各个成员默认设置为0;
3、不允许缩窄转化。

4.4.4其他结构属性

1)、 可以将结构作为参数传给函数,也可以让函数返回一个结构;
2、 可以使用赋值运算符“ = ”将结构赋给另一个同类型结构。

4.4.5 结构数组

可以创建元素为结构的数组,方法和创建基本类型数组完全相同。
inflatable结构包含一个数组,也可以创建元素为inflatable结构的数组,
inflatable gifts[100]; //一个包含100个inflatable类型的结构

4.5 共用体

共用体(union)是一种数据格式,可以存储不同的数据类型,但只能同时存储其中的一种类型。此处区别于结构体可以同时存储多种数据类型。

union one4all
{
   int int_val;
   long long_val;
   double double_val;
}

//可以使用one4all来存储int、long、double,条件是在不同的时间进行:

one4all pail;
pail.int_val = 15;            //store an int
cout << pail.int_val;          
pail.double_val =1.35;            //store a double, int value is lost
cout << pail.double_val;

上例中,pail开始是int变量,后来是double变量。成员名称标识了变量的容量,而共用体每次仅能存储一个值,故其长度为最大成员的长度。
可将共用体想象为一个格子的抽屉,一次只能存放一种物体,而结构体为一个拥有多个格子的抽屉,可同时存放多种物体。
共用体的用途:
 数据项使用两种或更多种格式(但不会同时使用),使用共用体可节省空间。比如管理一个商品目录,其中一些商品的ID为整数,另一些ID为字符串。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029605.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号