string类
可以使用string类来存储字符串
要使用string类,必须包含头文件string
string类定义隐藏了字符串的数组性质
可以将一个string对象赋值给另一个string对象
可以使用加号合并string对象
可以使用strcpy()将字符串复制到字符数组中
使用函数strcat()将字符串附加到字符数组末尾
-
例子1
# include <iostream> # include <string> int main() { using namespace std; char char1[20]; char char2[20] = "abcde"; string str1; string str2 = "qweryht"; string str3; cout << "请输入字符串:\n"; cin >> char1; // 将键盘输入的内容存储到str1对象中 cout << "请再输入一个字符串:\n"; cin >> str1; str3 = str1; cout << char1<< endl; cout << str1 << endl; cout << str3 << endl; return 0; }
-
string类I/O
-
例子
# include <iostream> # include <string> # include <cstring> int main() { using namespace std; char char1[20]; string str1; cout << "输入之前,char1的长度是:" << strlen(char1) << endl; cout << "输入之前,str1的长度是:" << str1.size() << endl; cout << "输入char1:\n"; cin.getline(char1,20); // 将一行输入读取到数组中 cout << "你输入的是:" << char1 << endl; cout << "输入str1:\n"; getline(cin,str1); // 将一行输入读取到string对象中 cout << "你输入的是:"<< str1<<endl; cout << "输入之后,char1的长度是:" << strlen(char1) << endl; cout << "输入之后,str1的长度是:" << str1.size() << endl; return 0; }
- 输入之前,char1的长度为1(对于未被初始化的数据,第一个空字符出现的位置是随机的,所以这个值可能不同)
- 输入之前,str1的长度为0,因为没有被初始化的string对象的长度自动设置为0
- cin.getline(charr,length)是istream类的一个类方法
- 参数charr:目标数组
- 参数length:数组长度,可以避免数组越界
- getline(cin,str):不是类方法
- 参数cin:指出到哪里去查找输入
- 参数str:目标string对象,这里不需要指出字符串长度,因为string对象将根据字符串的长度自动调整大小
-
-
其他形式的字符串字面值
wchar_t title[] = L"Chief Jack"; // w_char类型,使用前缀L表示 char16_t name[] = u"Three Z航"; // char_16类型,使用前缀u表示 char32_t car[] = U"小汽车"; // char_32类型,使用前缀U表示
结构
结构(struct)一种灵活的数据格式,可以存储多种类型的数据,结构也是cpp类的基础
-
结构是用户定义的类型,结构的声明定义了这种类型的数据属性
定义了类型之后,就可以创建这种类型的变量
创建结构分两步:1. 定义结构描述;2. 按照描述创建结构变量
-
例子1:定义一个结构
// 定义结构体 struct info { char name[20]; float stature; double weight; } // 使用结构体 info hat; // 使用成员运算符.来访问各个成员 cout << hat.stature<< endl;
- struct表示定义了一个结构的布局
- info是类型的名字,相当于int,float这种
- 大括号内是结构的成员,每一行是一条声明语句
-
例子2:在程序中使用结构
# include <iostream> struct info { char name[20]; // 定义的时候使用分号 float stature; double weight; }; int main() { using namespace std; info a1 = { "张三", // 使用的时候,结构中用逗号,不是分号 1.85, // 可以写在一行 90.45, }; info a2 = { "李四", 1.78, 70.56, }; cout << "下面是结构a1的信息:" << endl; cout << a1.name<< endl; cout << a1.stature << endl; cout << a1.weight << endl; cout << "下面是结构a2的信息:" << endl; cout << a2.name<< endl; cout << a2.stature << endl; cout << a2.weight << endl; return 0; }
-
其他结构属性
可以将结构作为参数传递给函数,也可以让函数返回一个结构
-
例子
# include <iostream> struct info { char name[20]; float stature; double weight; }; // 同时完成定义结构和创建结构变量的工作,(结构定义在main()外面,不然会报错) struct data { int id; char name[20]; } b1,b2; int main() { using namespace std; info a1 = {"张三",1.66,70.89}; cout << "下面是结构a1的信息:" << endl; cout << a1.name<< endl; cout << a1.stature << endl; cout << a1.weight << endl; info a2; a2 = a1; // 把结构a1直接赋值给a2 cout << "下面是结构a2的信息:" << endl; cout << a2.name<< endl; cout << a2.stature << endl; cout << a2.weight << endl; cout << "*****分割线*****" << endl; data b1 = {6,"李四"}; cout << "下面是结构b1的信息:" << endl; cout << b1.id<< endl; cout << b1.name << endl; data b2 = {7,"王老六"}; cout << "下面是结构b2的信息:" << endl; cout << b2.id<< endl; cout << b2.name << endl; cout << "*****分割线*****" << endl; // 创建一个包含50个info结构的数组 info aa[50]; // 数字aa中的每个元素都是info对象,可以和成员运算符一起使用 cout << "输入名字:\n"; cin >> aa[0].name; cout << aa[0].name << endl; cout << aa[15].stature << endl; // 注意,因为aa本身是一个数组,所以aa.stature这样的操作是无效的 return 0; }
- 注意:结构info中包含了一个数组name,那么也可以直接创建一个包含50个info结构的数组
-
可以同时创建多个结构对象
# include <iostream> struct info { char name[20]; float stature; double weight; }; int main() { using namespace std; info guest[2] = { {"张三",1.85,90.55}, {"李四",1.78,75.45} }; cout << "第一个guest结构:" << endl; cout << guest[0].name<< endl; cout << guest[0].stature<< endl; cout << guest[0].weight<< endl; cout << "第二个guest结构:" << endl; cout << guest[1].name<< endl; cout << guest[1].stature<< endl; cout << guest[1].weight<< endl; return 0; }
-
结构中的位字段
字段的类型应该是整型或者枚举,接下来是冒号,冒号后跟一个数字,这个数字指定的是使用的位数
每个成员被称为位字段(bit field)
-
例子
struct register1 { unsigned int SN:4; // 4bit的SN值 unsigned int :4; // 4bit 没有使用 bool goodIn:1; // 输入1bit }
共用体
共用体(union)是一种数据格式,可以存储不同的数据类型,但是同一时间只能给一种类型赋值,一旦某一种类型赋值了,其他的成员就变成未定义状态了
-
共用体的例子
union one { int a; long b; double c; };
- 因为共用体每次只能存储一个值,所以它必须有足够的空间来存储最大的成员,所以共用体的长度是其最大成员的长度
共用体的作用之一,就是当数据使用两种或多种格式的时候,可以节省空间(前提是不能同时使用)
-
匿名共用体(anonymous union)没有名字,成员将成为位于相同地址处的变量
-
例子
struct widget { char brand[20]; int type; union // 匿名共用体 { long id_num; // 第一种商品ID,类型是long char id_char[20]; // 第二种商品ID,类型是char }; }; widget prize; if (prize.type==1) cin >> prize.id_num; else cin >> prize.id_char;
- 共用体是匿名的,所以id_num和id_char是prize的两个成员,地址相同,由用户来确定当前是哪个成员在活动
-
枚举
枚举(enum)可以代替const创建符号常量的方式
-
例子
enum colors {red,orange,yellow,green,blue};
- colors称为新类型的名称,它被称为枚举(enum)
- colors中的red,yellow等被作为符号常量,它们对应的值是0到4,这些常量叫做枚举量(enumerator)
- 默认情况下将整数值赋给了枚举量
- colors变量受到限制,只能有5个可能的值(里面定义几个就有几个可能的值)
- 对于枚举来说,只定义了赋值运算符,没有定义算数运算符
-
设置枚举量的值
-
使用赋值运算符显式的设置枚举量的值
enum colors {red=1,orange=2,yellow=3,green=5,blue=9};
- 指定的值必须是整数
-
可以只显式的定义其中一些枚举量的值,没有显式定义的就使用默认的
enum colors {red,orange=2,yellow=3,green,blue=9};
-
可以创建多个值相同的枚举量
enum colors {red,orange=0,yellow=3,green,blue=9};
- red和orange的值都是0
-
-
枚举的取值范围
-
例子
enum abc{one = 1,two = 2,fout = 100,eight};
- 首先要找出上限,即需要知道枚举量的最大值n,找出n的最小的2的幂,减去1之后就是取值范围的上限,比如abc中最大枚举值是101(没有被初始化的枚举量的值将比其前面的枚举量大1 ),在2的幂中,比这个数大的最小值是128,所以取值范围上限就是127
- 找出下限,需要知道枚举量的最小值,如果它不小于0,则取值范围的下限是0,否则采用和寻找上限方式相同的方法,但是要加上符号,比如最小的枚举量是-6,那么比它小的,最大的2的幂是-8,所以下限是-7
-