数组 |
- 数组的声明
- int a[100];
- typename array_name[array_size];
- array_size 不能是变量
- 可通过索引(下标)对数组元素进行访问 – 下标范围[0, array_size)
- a[3] = 100;
- 数组的初始化
- int a[4] = { 3, 6, 8, 10};
- 只有创建时才能初始化, 此后便不能使用初始化表初始化了
- 也不能将一个数组赋值给另一个数组
- 可只对一部分元素初始化, 剩下的默认为0
- int a[4] = {2, 3}; // 此时数组值为 2 3 0 0
- 若[]内为空,则编译器将自动计算元素个数
- int a[] = {2, 3, 4, 5}; // 此时size = 4
- 初始化时可省略等于号(=)(C++11新增)
- double b[4]{1, 2, 3, 4};
- 可不在{}内包含任何东西, 此时所有元素初始化为0
- double b[4]{}
字符串 |
- 以空字符(ASCII码为0, C++里表示为 ‘\0’)结尾的char数组
- char pig[8] = { ‘v’, ‘e’, ‘r’, ‘y’, ‘f’, ‘a’, ‘t’, ‘\0’};
- char pig[] = “veryfat”;
- 任何两个由空白(空格, 制表符, 换行符) 分隔的字符串常量,都会自动拼接为一个
- cout << “aaa” “bbb” endl;
- 面向行的输入 – getline()
- getline将丢弃换行符, 使用空字符替代
- cin.getline(name, size);
- getline将丢弃换行符, 使用空字符替代
面向行的输入 – get()
- 并不读取换行符,而是将其留存输入队列中
- cin.get(name, size); // 此时换行符留在了输入队列中
- cin.get()可读取下一个字符即使是换行符
cin.get(a, maxn); cin.get(); // 读取换行符 cin.get(b, maxn);
也可以是
cin.get(a, maxn).get(); cin.get(b, maxn); // 返回一个cin对象 getline()也是
- 并不读取换行符,而是将其留存输入队列中
- getline()或get()读取空行时
- get()读取空行后将设置失效位(failbit), 这意味着接下来的输入将被阻断
- 可用 cin.clear(); 来恢复输入
- 当输入字符串比分配的空间长时,余下的字符将会留在输入队列中,且getline()会设置失效位
- 当使用cin>>a输入数字之后,会将换行符留在输入队列,此时应使用cin.get() 或 cin.get(ch)来读取并丢弃换行符
< cstring >
strcpy(charr1, charr2); // 复制charr2到charr1 strcat(charr1, charr2); // 拼接charr2到charr1
string类 |
初始化 – 可用C串初始化
string str = "hello"; string str {"hello"};
赋值
cin >> str; str1 = str2; // 可以将一个string对象(或C字符串)赋值给另一个string对象
拼接
str3 = str1 + str2; str1 += str2; // 将str2附加到str1的尾部
读取一行
getline(cin, str); // istream没有关于string的类方法
原始字符串(raw)
- 使用”()”作为定界符, R作为前缀 – 不需要转义字符
- 可自定义定界符, 只要保证 “和 ( 之间的字符与 ) 和 “之间的字符一样即可
cout << R"(Jim "King" uses "\n" instead of endl)" << endl; cout << R"+*(Jim "King" uses "\n" instead of endl)+*" << endl; // 自定义定界符
将输出
Jim “King” uses “\n” instead of endl
Jim “King” uses “\n” instead of endl
结构体(struct) |
// 定义结构体
struct node {
char name[20];
float volume;
double price;
};
// 初始化
node a = { "dua", 12.5, 30.3}; // 使用初始化参数表
node b {"dra", 10.0, 11.2}; // C++11初始化结构体
// 访问结构体成员
cout << x.name << endl;
// 赋值
node c = a;
可以在定义结构体的同时创建结构体变量
struct node { char name[20]; float volume; }a, b, c;
同时也可以初始化此变量
struct node { char name[20]; float volume; }a, b = {"dua", 12.5}, c;
也可以创建无名结构体
stuct { // 以后无法再创建同类结构体 int x, y; }position;
结构体数组
node x[2] = { {"dua", 12.5, 30.3}, {"dra", 13.5, 40.3} }; cout << x[1].name << endl;
结构体中的位字段
- 主要用于与硬件设备上的数据对应
- 字段类型应为整型或枚举, 后面跟冒号, 后面跟一个数字以指定位数
- 可以使用没有名称的字段来提供间距
struct node { unsigned int SN : 4; // 4位 unsigned int : 4; // 4位 bool flag : 1; // 1位 bool ok : 1; // 1位 }; node x = {14, true, true}; if(x.flag) cout << x.SN << endl;
共用体(union) |
union node {
int int_val;
long long_val;
double double_val;
};
//使用
node x;
x.int_val = 15;
cout << x.int_val << endl;
x.long_val = 20;
cout << x.long_val << endl;
- 可以存储不同的数据类型,但同时只能存储其中的一种
- 这些成员的内存地址是相同的,所以共用体的长度为其最大成员的长度
- 主要用于节省空间
- 常用于操作系统或硬件的数据结构
匿名共用体
struct widget { char brand[20]; int type; // 负责确定哪个共用体成员是活动的 union { long id_num; // 有的ID为数字 char id_char[20]; // 有的ID为字符串 }; }; widget x; if(x.type == 1) cin >> x.id_num; else cin >> x.id_char;
枚举(enum) |
enum color {red, green, blue};
- 用来创建符号常量, 默认从0开始,依次递增
- 枚举量可自动提升为int型, 但int 型需要强制转换成枚举型,且值要适当
- 枚举型没有定义加法
- 可省略枚举名称创建符号常量
- 显示设置枚举值
- enum color {red = 1, green = 4, blue = 8};
- 也可以只显示地定义其中一些枚举量的值,而没有被赋值的枚举量的值则为其前一个枚举量+1
- 枚举的取值范围
- 上限 – 找到枚举量的最大值,那么, 大于这个最大值的、最小的2的幂再减去1,即为取值范围的上限
- 下限 – 找到枚举量的最小值
- 如果它不小于0, 则取值范围的下限即为0
- 如果它小于0, 则要找到比它小的, 最大的2的幂再加上1,即为下限
- 例如,枚举量的最大值为101, 则比它大的最小的2的幂为128, 减1为127,即为上限
- 例如,枚举量的最小值为-6,则比它小的,最大的2的幂为-8,加1为-7,即为下限
- 作用域内枚举(C++11) 见第十章
- 当前传统枚举的作用域 为整个文件