设为首页 加入收藏

TOP

第4章 复合类型(一)
2023-07-23 13:27:38 】 浏览:118
Tags:

说明

看《C++ Primer Plus》时整理的学习笔记,部分内容完全摘抄自《C++ Primer Plus》(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社。只做学习记录用途。

复合类型是基于基本整型和浮点类型创建的,影响最为深远的复合类型是,除类外,C++ 还支持几种更普遍的复合类型,它们都来自 C 语言,例如:数组、结构、指针等。

4.1 数组

数组能够存储多个同类型的值,计算机在内存中依次存储数组的各个元素。数组声明应包含三点:元素类型数组名数组中的元素总数,如下:

//数组声明
typeName arrayName[arraySize];

其中的表达式 arraySize不能是变量,它必须是整型常量const值,也可以是常量表达式(如8*sizeof(int)),即表达式中所有值在编译时都是已知的。C++ 标准模板库(STL)提供了一种数组替代品,模板类vector,C++11 新增了模板类array,这些替代品比内置复合类型数组更复杂、更灵活,这将在后面章节介绍。声明数组后,数组中的元素总数也可以使用以下方式计算出来:

//数组中的元素总数
arraySize = sizeof(arrayName)/sizeof(typeName);

4.1.1 数组访问

使用[index]访问索引为 index的数组元素,索引从 0 开始,最后一个元素的索引比数组长度小 1

//声明长度为12的short数组
short months[12];

//访问它的第1个元素
months[0];

//访问它的最后一个元素
months[11];

注意:编译器不会检查索引是否有效,例如可以访问months[101]或者给它赋值,编译器并不会指出错误(有时会给个警告,不是以错误的形式指出),但是程序运行后,这种赋值可能破坏数据或代码,也可能导致程序异常终止,因此需人为确保程序使用有效的索引值。

4.1.2 数组初始化及赋值

只有在定义数组时才能使用初始化,也不能将一个数组赋给另一个数组,但可以逐元素赋值。初始化数组时,提供的值可以少于数组的元素数目,剩余的元素编译器会自动初始化为 0。

//定义时初始化全部元素
int arr1[4] = {3, 6, 8, 10};

//定义时只指定第一个值,剩余元素初始化为0
int arr2[4] = {3};

//定义时全部初始化为0
int arr3[4] = {0};

//定义时指定全部元素,让编译器自动统计元素个数
int arr4[] = {3, 6, 8, 10};

//C++11初始化方式:可省略等号
int arr5[4]{3, 6, 8, 10};

//C++11初始化方式:默认初始化为0
int arr6[4] = {};
int arr7[4]{};

注意:使用大括号进行列表初始化时禁止缩窄转换

4.2 字符串

C++ 处理字符串的方式有两种:第一种来自 C 语言,常被称为 C-风格字符串,第二种是下一节将介绍的string

C-风格字符串将字符串存储在char数组中,并以空字符结尾。空字符被写作\0,其 ASCII 码为 0,用来标记字符串的结尾。很多处理字符串的函数(如cout输出字符串)都逐个处理字符串中的字符,直到到达空字符为止,无论是否超过了char数组的实际大小。

4.2.1 C - 风格字符串的初始化及拼接

常用的初始化方法如下:

//逐个字符初始化,需人为加空字符
char cat[8] = {'f','a','t','e','s','s','a','\0'};

//使用字符串常量进行初始化,自动添加空字符
char bird[11] = "Mr. Cheeps";

//字符数组剩余元素自动初始化为空字符
char boss[8] = "Bozo";

//让编译器计算字符数组长度,长度为8
char fish[] = "Bubbles";

//C++11字符串初始化
char fish[] = {"Bubbles"};
char fish[]{"Bubbles"};

注意:字符串常量(使用双引号)不能与字符常量(使用单引号)互换。在 ASCII 系统上,字符常量'S'只是 83 的另一种写法,但"S"不是字符常量,它表示的是两个字符(字符S和字符\0)组成的字符串,更糟糕的是,"S"实际上表示的是字符串所在的内存地址。

C++ 允许将两个用引号括起来的字符串拼接成一个,任何两个由空白分隔的字符串常量都将自动拼接成一个。下面所有输出语句都是等效的:

//输出
cout << "Medical cotton swab.\n";

//使用空格分隔的拼接
cout << "Medical cot" "ton swab.\n";

//使用换行分隔的拼接
cout << "Medical cot"
    	"ton swab.\n";

注意:拼接时不会在被连接的字符串之间添加空格

4.2.2 C - 风格字符串的使用

sizeof(arrayName)指出整个字符数组的长度strlen(arrayName)指出字符数组中字符串的长度,且不把空字符计算在内。字符数组的长度不能短于strlen(arrayName)+1。包含头文件<cstring>后,可使用其中的字符串处理函数,常用的有,使用strcpy()将字符串复制到字符数组中,使用strcat()将字符串附加到字符数组末尾。还有对应的strncat()strncpy(),它们接受指出目标数组最大允许长度的第三个参数。

//将字符串arrayName2复制到数组a
首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【QCustomPlot】使用方法(源码方.. 下一篇C++面试八股文:std::string是如..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目