zoukankan      html  css  js  c++  java
  • 【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,否则采用与寻找上限方式相同的方式,但加上负号。
    • 一个整数不是枚举值,但处在枚举定义的取值范围内,则代码是合法的。运行结果则难以预料。
  • 相关阅读:
    最小生成树模板
    字符串模板
    单调队列
    代码优化
    ZJUT11 多校赛补题记录
    树链剖分
    网络基础及网络设备
    交换机介绍及选购全攻略
    将函数的返回值引用定义为引用
    函数指针和指针函数
  • 原文地址:https://www.cnblogs.com/shiyanch/p/2206540.html
Copyright © 2011-2022 走看看