【C++读书笔记之三】复合类型(上)

*数组是一种数据格式,能够存储多个同类型的值。每个值都存储在一个独立的数组元素中,计算机在内存中一次存储数组的各个元素(连续存储)。

 
*创建数组的声明语句应指出以下三点:

  • 存储在每个元素中的值的类型
  • 数组名
  • 数组中的元素数

*声明数组的通用格式 typeName arrayName[arraySize] ,其中arraySize必须是整型常数或const值,也可是常量表达式。即其中所有的值在编译时都是已知的,不能是变量。

*编译器不会检查使用的数组下标是否有效。

*如果将sizeof操作符用于数组名,得到的将是整个数组中的字节数。但如果将sizeof用于数组元素,则得到的将是元素的长度(单位为字节)。

  eg.  int array[10]; 则有 sizeof(array) == 40 , sizeof(array[0]) == 4

            且有 sizeof(array)/sizeof(array[0]) == arraySize == 10

*只有在定义数组时才能使用初始化,此后就不能使用,也不能将一个数组赋给另一个数组:

  int cards[4] = {3,6,8,10};  // okay

  int hard[4];          // okay

  hand[4] = {5,6,7,9}      // not allowed

  hand = cards;        // not allowed

*如果只对数组的一部分进行初始化,则编译器将其他元素设置为0

*如果初始化数组时方括号内为空,C++编译器将计算元素个数。

  eg. short totals[] = {1,5,3,8};  编译器将使totals数组包含4个元素。

=============================================================

*字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种。第一种来自C语言,常被成为C-风格字符串。另一种介于string类库。

*存储在连续字节中的一些列字符以为着可以将字符串存储在char数组中,其中每个字符都位于自己的数组元素中。

*C-风格字符串以空字符(null character)结尾,空字符被写作\0,其ASCII码为0,用来标记字符串的结尾。

  eg.   char dog[5] = {'b','e','a','u','x'};  // not a string!

      char cat[5] = {'f','a','t','s','\0'};   // a string!

      这两个都是char数组,但只有第二个是字符串。空字符串对C-风格字符串而言至关重要。

*将字符数组初始化为字符串的方法:使用一个双引号括起字符串即可。这种字符串被称作字符串常量(string constant)或字符串字面值(string literal)。

*用引号括起的字符串隐式地包括结尾的空字符。

*在确定存储字符串所需的最短数组时,别忘了将结尾的空字符计算在内。

*字符串常量(使用双引号)不能与字符常量(使用单引号)互换。

*任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。

  eg. char a[] = "abcdefg" "hijk";

    char b[] = "abcdefghijk";

    a与b的数组元素完全一样。

*sizeof操作符指出整个数组的长度,strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度(数组本身的长度在声明时决定,大于或等于数组中字符串的长度)。另外,strlen()函数只计算可见的字符,而不把空字符计算在内。

*cin使用空白(空格、制表符和换行符)来定字符串的界。

=============================================================

*string类使用起来比char数组简单,同时提供了将字符串作为一种数据类型的表示方法。

*在很多方面,使用string对象的方式与使用字符数组相同:

  • 可以使用C-风格字符串来初始化string对象。
  • 可以使用cin来将键盘输入存储到string对象中。
  • 可以使用cout来显示string对象。
  • 可以使用数组表示法来访问存储在string对象中的字符。

*string对象和字符数组之间的主要区别是,可以将string对象声明为简单变量,而不是数组。

*string类具有自动调整大小的功能。

=============================================================

*结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据,从而将数据的表示合并到一起。

*结构师用户定义的类型,而结构声明定义了这种类型的数据属性。定义了类型后,便可以创建这种类型的变量。

*代码中使用分号来结束结构的声明。

*C++允许在声明结构变量时省略关键字struct:

  eg.  struct inflatable goose;

       inflatalbe vincent;

*可以使用成员操作符(.)来访问各个成员。

*结构的初始化 详见书P85

*结构数组:数组的元素为结构体的对象

      inflatable guests[2] = 

     { 

           {"Bambi", 0.5, 21.99},

           {"Godzilla", 2000, 565.99}

     };

=============================================================

*C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。还允许定义新类型。

  eg.  enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

  • spectrum被称为枚举(enumeration)。
  • 将red,orange等作为符号常量,对应整数0~7.这些常量被叫作枚举量(enumerator)。可以通过显式地指定整数值来覆盖默认值。

*在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。

*枚举量是整型,可悲提升为int类型,但是int类型不能自动转换为枚举类型。

  eg.  int color = blue;  // valid, color == 4

       band = 3      // not valid

       color = red + 3   // valid, color == 3

*如果int值是有效的,则可以通过强制类型转换,将它赋给枚举变量

  eg.  band = spectrum(3);

*如果试图对一个不适当的值进行强制类型转换,结果是不确定的,这意味着不会出错,但得到的结果不可依赖。

*设置枚举量的值

  • 可以使用赋值操作符来显示地设置枚举变量的值: enum bits{one = 1, two = 2, four = 4, eight  = 8};指定的值必须是整数。
  • 可以只显式地定义其中一些枚举变量的值: enum bigstep{first, second = 100, third} 后面没有被初始化的枚举量的值将比其前面的枚举量大1,故third的值为101
  • 可以创建多个值相同的枚举量: enum {zero, null = 0, one, numero_uno = 1};

*枚举的取值范围

  • 上限:找到枚举值的最大值,然后找出大于这个最大值的、最小的2的幂,将它减去1,即为上限。
  • 下限:找到枚举值的最小值,如果不小于0,则取值范围下限为0,否则采用与寻找上限方式相同的方式,但加上负号。
  • 一个整数不是枚举值,但处在枚举定义的取值范围内,则代码是合法的。运行结果则难以预料。
原文地址:https://www.cnblogs.com/shiyanch/p/2206540.html