C++学习之复合类型(1)

1.数组  访问数组的方法是使用下标或者索引来对元素进行编号。C++数组从0开始编号。注意:例如months[12],months表示数组的第一个元素,months[11]表示最后一个元素,最后一个元素的索引比数组长度小;

2.当使用sizeof运算符返回类型或者数据对象的长度(单位为字节)。注意,如果将sizeof运算符用于数组名,将得到是整个数组中的字节数。但如果将sizeof用于数组元素,则将得到是元素的长度(单位为字节);

3.数组以前课使用列表初始化,但在C++11中的列表初始化新增了一些功能

首先,初始化数组时,可省略等号(=)

double earning[4]  {1.2e4,1.6e4,1.1e4,1.7e4};

其次,可不在大括号内包含任何东西,这将把所有的元素都设置为0;

unsigned int counts[10]={};

float balance[100] {};

第三,列表初始化禁止缩窄转化

long plifs[]={25,92,3.0};

char slifs[4]{'h','i',1122011,'\0'};

char tlifs[4]{'h','i',112,'\0'};

在上述代码中,第一条语句不能通过编译,因为将浮点数转化为整型是缩窄操作,即浮点数的小数点后面为0.第二条语句也不能通过编译,因为1122011超出了char变量的取值范围(这里假设char 变量的长度为8位).第三条语句可通过编译,虽然112是一个int值,但它在char变量的取值范围内;

4.字符串  

例如:

char dog[8] = {'b','e','a','u','x',' ','I','I'};

char cat[8]={'f','a','t','e','s','s','a','\0'};

只有第二个数组是字符串。因为空字符对C-风格字符串而言至关重要。如果使用cout显示上面的cat这样的字符串,则将显示前7个字符,发现空字符后停止。但是如果使用cout显示上面的dog数组(它不是字符串),cout将打印出来数组中的8个字符,并接着将内存中随后的各个字节接收为要打印的字符,直到遇到空字符为止。

在cat数组事例中,将数组初始化为字符串的工作看上去乏味——使用大量的单引号,且必须记住加上空字符。所以出现了一种比较方便的方式——只需要使用一个引号括起来的字符串即可,这种字符串被称为字符串常量或字符串字面值,如下所示:

char bird[11]="Mr .Cheeps";

char fish[]="Bubbles";

用引号括起来的字符串隐式的包括结尾的空字符,因此不用显示地包括他;

注意,字符串常量(使用双引号)不能与字符常量(使用单引号)互换。因为“s”不是字符常量,他表示的是两个字符(字符s和'\0')组成的字符串。更糟糕的是,“s”实际上表示的是字符串所在的内存地址。

5.strlen()函数 是返回的是存储在数组中字符串的长度,而不是数组本身的长度。

6.cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这就意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。

7.每次读取一行字符串输入

istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get();这两个函数都读取一行输入,直到到达换行符。getline()将丢弃换行符,而get()将换行符保留在输入序列中。

调用方法:

cin.getline(): 该函数有两个参数。第一个参数用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。

cin.get(): 该函数有几种变体。其中一种变体的工作方式与getline()类似,他们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get并不再读取并丢弃换行符,而是将其留在输入队列。假设我们连续调用get():

cin.get(name,ArSize);

cin.get(dessert,Arsize);

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因为get()认为已达到行尾,而没有发现任何可读的内容。如果不借助帮助,get()将不能跨过该换行符。

幸运的是,get()有另一种变体。使用不带任何参数的cin.get()调用可读去下一个字符(即使 是换行符),因此可以用它来处理换行符,为读取下一行输入做好准备。也就是说,可以采用下面的调用序列:

cin.get(name,ArSize);

cin.get();

cin.get(name,ArSize);

另一种使用get()的方式是将两个类成员函数拼接起来(合并),如下所示:

cin.get(name,ArSize).get();

之所以可以这样做,是由于cin.get(name,ArSize)返回一个cin()对象,该对象随后将被用来调用get()函数。同样,下面的语句将把输入中连续的两行分别读入到数组name1和name2中其效果与两次调用cin.getline()相同:

cin.getline(name1,ArSize).getline(name2,ArSize);

通常更赞同使用get();首先,老式实现没有getline();其次,get()使输入更仔细,例如,假设get()将一行读入数组中。如何知道停止读取的原因是由于已经读取额整行,而不是由于数组已经填满了?查看下一个输入字符,如果是换行符,说明已读取了整行;否则,说明该行中还有其他的输入。

8.空行和其他问题

当getline()或get()读取空行时,将会发生什么情况?最初的做法是,下一条输入语句将在前一条getline()或get()结束读取的位置开始读取;但当前的做法是。当get()(不是getline())读取空行后将设置失效位。这就意味着接下来的输入将被阻断,但可以用下面的命令来恢复:

cin.clear();

另一个潜在的问题是,输入字符串可能比分配的空间长。如果输入行包含的字符比指定的多,,则getline()和get()将余下的字符留在输入队列中,而getline()还会设置失效位,并关闭后面的输入。

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_38721302/article/details/82829595