第四章 复合类型

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)将报错)。

 

以上是关于第四章 复合类型的主要内容,如果未能解决你的问题,请参考以下文章

Android 片段与复合控件

C++Primer 第四章

C++ Primer Plus学习:第四章

复合(或引用)数据类型图解:及例题代码

类型系统的运算法则--代码阅读神器--类型关乎复合

第四章:对象的组合——java并发编程实战