IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++学习要点总结(第四章) -> 正文阅读

[C++知识库]C++学习要点总结(第四章)

第四章 复合类型

4.1 数组

数组(array)是一种数据格式,能够存储多个同类型的值。每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素。

要创建数组,可使用声明语句。数组声明应指出以下三点:

  • 存储在每个元素中值的类型
  • 数组名
  • 数组中的元素数

声明数组的通用格式如下:

typeName arrayName[arraySize];

注意:arraySize它必须是整型常数或const值,也可以是个常量表达式,即所有值在编译的时候都是已知的。

数组可以单独访问数组元素,方法是通过使用下标或索引来对元素进行编号。(C++数组从0开始编号。)

小tips:编译器不会检查使用的下标是否有效。但是程序运行后,下标无效可能会引发问题,它可能会破坏数据结构或代码,也可能会导致程序的终止。所以必须确保程序只使用有效的下标值。

下面这段代码说明了数组的一些属性,包括声明数组、给数组元素赋值以及初始化数组。

#include<iostream>
using namespace std;
int main()
{
	int yams[3];//创建一个含三个元素的数组
	yams[0] = 7;//依次对第一个第二个第三个元素进行赋值操作,不能对yams[3]赋值,为无效下标
	yams[1] = 8;
	yams[2] = 6;
	int yamcosts[3] = { 20,30,5 };//对yamcosts这个数组进行初始化及赋值操作
	cout << "Total yams=";
	cout << yams[0] + yams[1] + yams[2] << endl;
	cout << "The package with " << yams[1] << " yams costs";
	cout << yamcosts[1] << "cents per yam." << endl;
	int total = yams[0] * yamcosts[0] + yams[1] * yamcosts[1] + yams[2] * yamcosts[2];
	cout << "The total yam expense is " << total << " cents.\n";
	cout << endl;
	cout << "size of yams array=" << sizeof yams << "bytes" << endl;
	cout << "size of one element=" << sizeof yams[0] << "bytes" << endl;
	return 0;
}

注意:sizeof运算符用于数组名的时候,得到的将是整个数组中的字节数。但如果将sizeof用于数组元素,则得到的将是元素的长度(单位为字节)。这表明yams是一个数组,而yams[1]只是一个int 变量。

4.1.1 数组的初始化规则

只有在定义数组的时候才能使用初始化,此后就不能对数组进行初始化操作了。也不能将一个数组赋给另一个数组。然而,可以使用下标分别给数组中的元素赋值。初始化数组的时候,提供的值可以少于数组的元素数目。(int yams[5]={1,2,3};编译器会把未提供值的元素设为0)

如果初始化数组时方括号内([])为空,C++编译器将计算元素个数。(通常情况下让编译器计算元素个数是种很糟的做法。如果主要关心的问题是程序,而不是自己是否知道数组的大小,则可以这样做: short things[]={1,5,3,8}; int num_elements=sizeof things/sizeof(short);)

4.1.2 C++11数组初始化方法

C++11将使用大括号的初始化作为一种通用初始化方式,可用于所有类型。

C++11中的列表初始化新增了一些功能:

  • 初始化数组的时候可以省略等号。例如int yams[5]={1,2,3,4,5};int photos[3]{1,2,3};
  • 可以不在大括号中包含任何东西,这将把所有元素都设置为0。
  • 列表初始化禁止缩窄转换。(缩窄转换是指:将浮点数转换为整数,从取值范围大的浮点数转换为取值范围小的浮点数(在编译期可以计算没有超出范围的表达式可以),从整数转换为浮点数,从取值范围大的整数转换为取值范围小的整数(在编译器可以计算没有超出范围的表达式),还有不能超出char型(数组类型)的取值范围。)

4.2 字符串

字符串是存储在内存的连续字节中的一系列字符。

C-风格字符具有一种特殊的性质:以空字符结尾,空字符被写作\0,其ASCII码为0,用来标记字符串的结尾。

char dog[3]={'a','b','\0'};//是字符串

char dog[3]={'a','b','c'};//不是字符串

在cout打印的时候,遇到空字符就停止。

char birds[11]="Mr.Cheeps";

char fish[]="Bubbles";

以上两个初始化方式都可以,用引号括起的字符串隐式地包括结尾的空字符。

注意:在确定存储字符串所需的最短数组时,别忘了将结尾的空字符计算在内。

注意:字符串常量(使用双引号)不能与字符常量(使用单引号)互换。字符常量如‘A’。但“A”不是字符常量,它表示的是两个字符A和\0。

4.2.1 拼接字符串常量

有时候字符串很长,无法放到一行中。C++允许拼接字符串字面值,即将两个用引号括起来的字符串合并为一个。事实上,任何两个由空白(空格、制表符和换行符)分隔打的字符串常量都将自动拼接称一个。

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

4.2.2 在数组中使用字符串

要将字符串存储到数组中,最常用的方法有两种——将数组初始化为字符串常量、将键盘或文件输入读入到数组中。

下面一段代码,使用了strlen()和sizeof可以看一下它们的区别。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	const int size = 15;
	char name1[size];
	char name2[size] = "C++owboy";
	cout << "Hody:I'm" << name2;
	cout << "What's your name?" << endl;
	cin >> name1;
	cout << "well," << name1 << ",your name has";
	cout << strlen(name1) << "letters and is stored" << endl;
	cout << "in an array of" << sizeof(name1) << "bytes" << endl;
	cout << "Your initial is " << name1[0] << '.' << endl;
	name2[3] = '\0';
	cout << "here are the first 3 characters of my name:";
	cout << name2 << endl;
	return 0;
}

strlen()只计算可见的字符,而不把空字符计算在内。

4.2.3 字符串的输入

字符串的输入中存在一个缺陷。下面程序将揭示该缺陷。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	const int size = 100;
	char name[size];
	char dessert[size];
	cout << "Enter your name:" << endl;
	cin >> name;
	cout << "Enter your favourite dessert:" << endl;
	cin >> dessert;
	cout << "I have some delicious " << dessert;
	cout << "for you, " << name << endl;
	return 0;
}

cin使用空白(空格、制表符和换行符来确定字符串的结束为止),这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放在数组中,并自动在结尾处添加空字符。

4.2.4 每次读取一行字符串输入

下面将介绍两个成员函数分别是getline()和get()。

1.面向行的输入:getline()

getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。如,cin.getline(name,20)将输入的值读取到一个包含20个元素,名字为name的数组中。

注意:getline()函数每次读取一行。它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串的时候,它用空字符来替换换行符。

下面一段代码将展示如何调用getline()。

#include<iostream>
using namespace std;
int main()
{
	const int size = 100;
	char name[size];
	char dessert[size];
	cout << "Enter your name:" << endl;
	cin.getline(name, size);
	cout << "Enter your favorite dessert " << endl;
	cin.getline(dessert, size);
	cout << "I have some delicious " << dessert;
	cout << "for you, " << name << endl;
	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:28:13  更:2021-07-25 11:28:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 7:14:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码