《C++ primer plus》学习笔记——第四章
一、数组
数组的申明应该注意以下三点:
1)存储在每个元素中的值的类型
2)数组名
3)数组中的元素数
创建数组
eg:
// hexoct2.cpp -- display values in hex and octal
#include <iostream>
#include<stdlib.h>
using namespace std;
int main()
{
using namespace std;
int yams[3]; // creates array with three elements
yams[0] = 7; // assign value to first element
yams[1] = 8;
yams[2] = 6;
int yamcosts[3] = {20, 30, 5}; // create, initialize array
// NOTE: If your C++ compiler or translator can't initialize
// this array, use static int yamcosts[3] instead of
// int yamcosts[3]
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.\n";
int total = yams[0] * yamcosts[0] + yams[1] * yamcosts[1];
total = total + yams[2] * yamcosts[2];
cout << "The total yam expense is " << total << " cents.\n";
cout << "\nSize of yams array = " << sizeof yams;
cout << " bytes.\n";
cout << "Size of one element = " << sizeof yams[0];
cout << " bytes.\n";
system("pause");
return 0;
}
说明:
1)C++允许在申明语句中初始化数组元素,程序给yam的元素赋值时,绕了一个大弯
2)sizeof运算符返回类型或数据对象的长度(单位为字节),注意,如果将sizeof运算符用于数组名,得到的将是整个数组中的字节数,但是如果将sizeof用于数组元素,则得到的将是元素的长度(单位为字节)。这表明yams是一个数组,而yams[1]只是一个int变量
2.数组的初始化规则
C++11使用大括号额初始化(列表初始化)作为一种通用初始化方式,可用于所有类型
1)定义数组时的初始化
eg:
2)初始化数组时,提供的值可以少于数组的元素数目
3)只对数组的一部分进行初始化,则编译器将把其它元素设置为0
如果初始化为{1}而不是{0},则第一个元素被设置为1,其它元素都被设置为0
4)如果初始化数组时,方括号内([])为空,C++编译器将计算元素个数
如果主要关心的问题是程序,而不是自己是否知道数组的大小,则可以这样去做:
3.C++11数组初始化的方法
C++11中的列表初始化新增了一些功能
1)初始化数组时,可省略等号(=)
2)可不在大括号内包含任何东西,这会将所有元素都设置为0
3)列表初始化禁止缩窄转换(格式转换)
上述代码中,
第一条语句不能通过编译,因为将浮点数转换为整型是缩窄操作,即使浮点数的小数点后面为零
第二条语句也不能通过编译,因为1122011超出了char变量的取值范围
第三条语句可通过编译,因为虽然112是一个int值,但它在char变量的取值范围内
二、字符串
C++处理字符串的方式有两种,第一种来自C语言,第二种是基于string类库的方法
eg:
这两个数组都是char数组,但是只有第二个数组是字符串。
‘\0’是空字符
如果使用cout显示上面的cat这样的字符串,则将显示前7个字符,发现空字符后停止。
如果使用cout显示上面的dog数组(他不是字符串),cout将打印数组中的8个字母,并接着将内存中随后的各个字节解释为要打印的字符,直到遇到空字符为止。
注意:在cat数组中,将数组初始化为字符串的工作看起来冗长乏味,使用了大量单引号,且必须记住加上空字符。
将字符数组初始化为字符串的方法——只需使用一个用引号括起来的字符串即可,这种字符串被称为字符串常量(string constant)
注意,用括号括起来的字符串隐式地包括结尾的空字符,因此,不用显示地包括它。
另外,各种C++输入工具通过键盘输入,将字符串读入到char数组中的时候,会将自动加上结尾的空字符。
让数组比字符串长没什么坏出,只是会浪费一些空间而已。这是因为处理字符串的函数根据空字符的位置,而不是数组长度来进行处理
注意:字符串常量与字符常量不能互换。
早ASCII系统上,‘S’只是83的另一种写法,因此,下面的语句将83赋值给shirt_size:
"S"不是字符常量,它表示的是两个字符(字符S和\0)组成的字符串。“S”实际上表示的是字符串所在的内存地址,因此下面的语句试图将一个内存地址赋给shirt_size,这个是不行的
1.拼接字符串常量