第四章 复合类型
Posted sungnox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四章 复合类型相关的知识,希望对你有一定的参考价值。
数组、结构和指针是C++的三种符合类型
数组的初始化规则:
1. float hotelTips[5] = {5.0, 2.5}; //只初始化前两个元素
2. long totals[500] = {1}; //第一个元素设为1,其它所有元素都初始化为0
3. short things[] = {1, 5, 3, 8}; //编译器将使things数组包含4个元素
C-风格字符串:
以空字符结尾,空字符写作‘\0‘
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 /*C风格的字符串以‘\0‘结尾*/ 6 char c1[3] = {‘O‘,‘h‘,‘!‘}; 7 cout << c1 << endl;//将显示乱码 8 char c2[4] = {‘O‘,‘h‘,‘!‘,‘\0‘}; 9 cout << c2 << endl;//正常显示 10 11 system("pause"); 12 return 0; 13 }
cout对象在遇到‘\0’时截断输出。
用引号括起的字符串,隐式地包括空字符。
C++通过键盘输入,将自动加上结尾的空字符。
字符串的拼接:
/*拼接字符串*/ char s1[] = "i\‘m" " fine!"; cout << s1 << endl;
字符串间以空格隔开,第二个字符串紧跟在第一个后面,而不考虑第一个字符串结尾的‘\0’。
cin以空格来标记字符串的结束位置。
每次读取一行字符串
istream中的类(如:cin)提供了一些面向行的类成员函数:getline()和get();而getline()将丢弃换行符,get()把换行符留在队列中,作为下一个输入的首字符。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int main() 5 { 6 const int Size = 20; 7 char City[Size]; 8 char Name[Size]; 9 cout << "enter your city:\n"; 10 // cin.getline(City, Size); 11 cin.get(City, Size);//get()将换行符保留在输入列队里,使得下一个get(Name, Size)直接读入‘\n‘。 12 cin.get();//读取下一个字符,这里用来读取换行符。这里必须加个get()函数,以清空输入队列。 13 cout << "enter your name:\n"; 14 // cin.getline(Name, Size); 15 cin.get(Name, Size); 16 cout << "your city is " << City << " name is " << Name << endl; 17 int Sz = strlen(City);//统计显示字符长度 18 cout << Sz << endl; 19 system("pause"); 20 return 0; 21 }
可以采用cin.get(City, Size).get()的写法。
用cin >> 输入也会将换行符留在队列中。
读取空行将设置失效位(failbit)?
string类:
string类在头文件string中定义
string对象和字符数组之间的主要区别是:可以将string对象声明为简单变量,而不是数组,string类有自动调整大小的功能。
不能将一个数组赋值给另一个数组,当能将一个string对象赋值给另一个string对象。
可以使用‘+’将两个string对象合并。
头文件cstring中定义了处理字符数组的函数,strcpy、strcat、strlen(等同于string对象的size()类函数)等。
getline是istream的类方法,但是istream的设计考虑了诸如double, int等C++基本类型,而没考虑string类型。因此没有处理string类型的类方法。cin和cout能直接处理string对象,因为string对象的代码使用了string类的一个友元函数。
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 string str1; 8 char str2[20]; 9 cout << "string object:\n"; 10 cin.getline(str2, 20); 11 cout << "array:\n"; 12 getline(cin, str1); 13 cout << str1 << "length:" << str1.size() << ‘\n‘ << str2 << "length:" << strlen(str2) << endl; 14 system("pause"); 15 return 0; 16 }
枚举
C++的enum工具提供了另一种创建符号常量的方法,这种方法可以替代const。
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
在不进行强制类型转换时,智能将定义枚举时使用的枚举量赋值给枚举变量(spectrum band)。
只为枚举定义了赋值运算符,而没定义算术运算符。
如果int值是有效的,可以通过强制类型转换将它赋给枚举变量(band = spectrum(3) )
可以使用赋值运算符来显示地设置枚举量的值。
枚举值可以重复。
枚举的取值范围
通过强制类型转换,可以将取值范围内的任何整数值赋给枚举变量。
上限:大于枚举量的最大值的最小的2的幂次方的值减1。
下限:枚举量的最小值大于等于0时,下限为0;小于0时,下限类比于上限取值,只不过为负。
指针
使用new动态分配内存:
int* pr = new int; delete pr; int* pq = new int [SIZE]; delete [] pq;
数组的替代品:
1. vector模板类,数据对象存储在堆中。自动使用new和delete来管理内存,比数组功能强大但效率低下。
数组大小可定义为变量
#include<vector> int SIZE; cin >> SIZE; vector<int> A(SIZE);
2. C++ 11新增array类,数据对象存储在栈中,效率比vector高,但数组大小不能定义为变量。
#include<array> array<int, 4> A;
注:C++11中,可将列表初始化用于vector和array对象,但c++98不允许对vector这么做。
同时,vector和array对象还提供了成员函数at(),在运行期间捕获非法索引(A.at(-1)将报错)。
以上是关于第四章 复合类型的主要内容,如果未能解决你的问题,请参考以下文章