《C++ Primer Plus》第4章学习笔记

内容思维导图

第4章 复合类型

内容要点

1. 数组

  • 数组(array)是一种数据格式,能够存储多个同类型的值。
  • 数组声明应指出以下三点:
      1. 存储在每个元素中的值的类型。
      1. 数组名。
      1. 数组中的元素数。
  • 声明数组的通用格式:
// arraysize指定元素数目,必须是整型常数或const值,也可以是常量表达式
typename arrayname[arraysize];

// 数组声明
int data[10];
// 数组初始化
int data[3] = { 20, 30, 40 };
int data[] = { 4, 8 };       // 由编译器计算元素个数
int data[6] = { 7, 10 };   // 部分初始化,其他编译器设置为0 
  • 数组初始化的几条规则:
      1. 只有在定义数组才能使用初始化,此后就不能使用,也不能将一个数组赋值给另一个数组;
      1. 初始化数组时,提供的值可以少于数组的元素数目,未提供值的元素编译器设置为0;
      1. 初始化数组时方括号([])为空,编译器将计算元素个数。

2. 字符串

  • 字符串是存储在内存的连续字节中的一系列字符。
      1. C-风格字符串(C-style string)
      1. 基于string类库的方法
  • C-风格字符串具有一种特殊的性质:以空字符(null character)结尾,空字符被写作\0,其ASCII码为0,用来标记字符串的结尾。注意:下面第二个字符数组才是字符串。
char dog[5] = { 'b', 'e', 'a', 'u' 'x' }   // 不是字符串
char cat[5] = { 'f', 'a', 't', 's', '\0' } // 是字符串
  • 用引号括起的字符串(字符串常量string constant或字符串字面值string liteal)隐式的包括结尾的空字符,因此不用显式的包括它。
char bird[10] = "Mr. Cheeps";   // 隐含\0字符
char fish[] = "Bubbles";        // 让编译器计算数组元素个数
  • 各种C++输入工具通过键盘输入,将字符串读入到数组中时,将自动加上结尾的空字符。
  • 任何两个空白(空格、制表符和换行符)分隔的字符串常量将自动拼接成一个。
cout << "I'd give my right arm to be" " a great violinist.\n";
cout << "I'd give my right ar"
"m to be" " a great violinist.\n";
  • 将字符串存储到数组最常用的两种方法:
      1. 将数组初始化为字符串常量
      1. 将键盘或文件输入读入到数组中
  • cin使用空白(空格、制表符和换行符)来定字符串的界。
  • cin面向行的类成员函数
      1. getline():丢弃换行符
      1. get():将换行符保留在输入序列中
  • cin.get()读取空行后将设置失效位(failbit),意味着将接下来的输入阻断,可使用命令cin.clear()来恢复输入。
  • C++程序常使用指针(而不是数组)来处理字符串。

3. string类简介

  • string对象和字符数组之间的主要区别是,可以将string对象声明为简单变量,而不是数组。
  • string类的一些操作
      1. 赋值:可以将一个string对象赋给另一个string对象
      1. 合并:可以使用操作符+将两个string对象合并起来
      1. 附加:可以使用操作符+=将一个字符串附加到一个string对象的末尾
      1. 计算长度:使用类方法size()计算string对象的字符串长度

4. 结构简介

  • 创建结构的步骤:
      1. 定义结构描述——描述并标记能够存储在结构中的各种数据类型
      1. 按描述创建结构变量(结构数据对象)
// structure description
struct inflatable
{
    char name[20];   // member
    float volume;
    double price;
};

struct inflatable goose;   // keyword struct required in C
inflatable vincent;        // keyword struct not required in C++
  • C++允许指定占用特定位数的结构成员,使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,指定使用了的位数。可以使用没有名称的字段来提供间距。每个成员都被称为位字段(bit field)。
struct torgle_register
{
    unsigned int SN: 4;  // 4 bits for SN value
    unsigned int: 4;     // 4 bits unused
    bool gooIn: 1;       // valid input (1 bit)
    bool goodTorgle: 1;  // successful torgling
}

5. 共用体

  • 共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。声明句法如下:
union one4all
{
    int int_val;
    long long_val;
    double double_val;
};
  • 共用体的长度为其最大成员的长度。

6. 枚举

  • C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。枚举的符号常量叫作枚举量(enumerator)。语法如下:
enum spectrum { red, orange, yellow, green, blue, violet, indigo, ultraviolet };
  • 枚举变量的一些特殊属性
      1. 在不进行强制转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。
      1. 对于枚举,只定义了赋值操作符,没有为枚举定义算术运算。
      1. 枚举量为整型,可被提升为int整型,但int不能自动转换为枚举类型。
  • 设置枚举量的值
      1. 使用赋值操作符显示设置
      1. 显式定义其中一些枚举量的值
      1. 可创建多个值相同的枚举量
      1. 可以使用long类型值
enum bits { one = 1, two = 2, four = 4, eight = 8 };
enum bigsteps { first, second = 100, third };   // first为0,third为101
enum { zero, null = 0, one numero_uno = 1 };    // zero和null值都为0
  • 每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数值赋给枚举变量,即使这个值不是枚举值。
enum bits { one = 1, two 2, four = 4, eight 8 };

myflag = bits(6);   // valid

7. 指针和自由存储空间

  • 指针相关操作符
      1. 取址操作符:&
      1. 间接值或解除引用操作符:*
      1. 内存分配new
      1. 内存释放delete
      1. 箭头成员操作符->
  • 指针声明
int * pData;  // 两边空格可选
int* pData;   // C++ style
int *pData;   // C style

// Note!!!
int* p1, p2;   // p2是int变量不是指针
  • 注意:在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。
  • 警告:一定要在对指针应用解除引用操作符(*)之前,将指针初始化为一个确定的,适当的地址。
  • 术语“数据对象”,指的是为数据项分配的内存块。为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:
typename pointer_name = new typename;
  • 在编译时给数组分配内存被称为静态联编(static binding);数组在程序运行时创建的称为动态联编(dynamic binding),这种数组叫做动态数组(dynamic array)
  • 使用newdelete时应遵守的规则:
      1. 不要使用delete来释放不是new分配的内存。
      1. 不要使用delete释放同一个内存块两次。
      1. 如果使用new[]为数组分配内存,则应使用delete[]来释放。
      1. 如果使用new[]为一个实体分配内存,则应使用delete来释放。
      1. 对空值指针应用delete是安全的。
  • 为数组分配内存的通用格式:
type_name pointer_name = new type_name [num_elements];

8. 指针、数组和指针算术

  • 指针与数组名的区别

      1. 可以修改指针的值,而数组名是常量。
      1. 对数组应用sizeof操作符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。
  • cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。

  • 在C++中,用引号括起来的字符串像数组名一样,也是第一个元素的地址。

  • C++3种管理数据内存的方式

      1. 自动存储
      1. 静态存储
      • 2.1 函数外部定义
      • 2.2 声明变量时使用关键字static
      1. 动态存储
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容