【C++PrimerPlus】第四章 复合类型


前言

本篇文章将对《C++PrimerPlus》第4章进行勾画
以我个人习惯来勾画
C和C++不同点将用红色高亮表示
关于C++的额外补充知识用蓝色高亮表示
对C++的注意点以及总结部分用绿色高亮
正常情况本专栏2周更新一次

在这里插入图片描述

4.1 数组

在这里插入图片描述

4.2 字符串

在这里插入图片描述

4.2.1 拼接字符串常量

在这里插入图片描述

4.2.2 在数组中使用字符串

在这里插入图片描述

4.2.3 字符串输入

在这里插入图片描述

4.2.4 每次读取一行字符串输入

在这里插入图片描述

  • 成员函数getline()类似于C语言中的gets(),二者都是面向行输入,并且都将换行符读取并转化为结束符存储,二者都不会忽略空白符
  • 成员函数get()(有参数)类似于C语言中的scanf(),二者都是面向单词输入,并且遇见换行符会自动在末尾添加结束符,不会将换行符从缓冲区读出来,不同之处是scanf会忽略空白符,get()不会忽略空白符
  • 成员函数get()(无参数)类似C语言getchar(),二者都不会忽略空白符
  • cin类似C语言scanf,二者都会忽略空白符

4.2.5 混合输入字符串和数字

在这里插入图片描述

4.3 String类

在这里插入图片描述

String类包含于头文件string
使用String类需要使用using编译指令
string类和字符数组的相同点

  • 都可以使用字符串常量初始化
  • 都可以使用cin来输入
  • 都可以使用cout来输出字符串
  • 都可以使用数组的表示法来访问存储再string对象中的字符

不同点

  • string对象表示的是一个字符串实体,字符数组存储的是一个个字符

4.3.1 C++11字符串初始化

在这里插入图片描述

4.3.2 赋值、拼接和附加

在这里插入图片描述

string对象可以执行的功能

  1. 赋值,string类对象可以将整个字符串直接赋值给另一个string类对象
    例如str1 = str2
  2. 拼接,可以使用+将2个string对象合并

4.3.3 sring类的其他操作

在这里插入图片描述

  • string对象不需要担心字符串过长,对象存不下,string类具有自动调整大小的功能
  • string类具有成员函数size来求字符串的长度,无需调用库函数strlen

4.3.4 string类I/O

在这里插入图片描述

  • 输入string类对象可以使用getline(读取一整行)函数,第一个参数为cin,第二个参数为string对象
  • 输入string类对象可以使用cin(读取一个单词)
  • string对象未初始化时长度默认为0

4.3.5 其他形式的字符串

在这里插入图片描述

除了普通的字符串
c++还有wchar_t(宽字符串) char16_t char32_t 类型的字符串,它们每个字符所占的大小与普通字符不同
在这里插入图片描述
C++还有原始类型(raw)字符串,原始类型字符串中没有转义字符
在这里插入图片描述

4.4 结构简介

在这里插入图片描述

C++中的结构和C语言中的结构不完全一样,C++可以直接用结构体标签定义变量,而C语言必须加上struct关键字

4.2.1 在程序中使用结构

在这里插入图片描述

C++推荐在外部声明结构,外部声明的结构可以在所有函数中使用
C++不推荐外部声明变量

4.4.2 C++11结构初始化

在这里插入图片描述

4.4.3 结构可以作为string类的成员吗

在这里插入图片描述

4.4.4结构的其他属性

在这里插入图片描述

  • 可以将一个结构变量赋值给另一个结构变量
  • C++的结构中可以定义函数,C不行

4.4.5 结构数组

在这里插入图片描述

4.4.6 结构中的位字段

在这里插入图片描述

4.5 共用体

在这里插入图片描述

  • C++可以直接用共用体标签定义变量,C不行
  • 共用体的成员公用一个地址,共用体的成员可以在不同的时候存储不同的数据
  • 当结构体成员是匿名共用体时,共用体中的成员被视为结构体的成员
  • 共用体常用于节省内存

4.6 枚举

在这里插入图片描述

  • 枚举用关键词enmu定义,枚举中的符号称为枚举常量
  • 枚举常量的值默认从0开始,可以通过显示的整型值覆盖默认值
  • 在不进行强制类型转换时,只能将枚举常量赋值给枚举变量
  • 对于枚举变量,只定义了赋值运算,没有定义算术运算
  • 枚举是整形,可以被提升为int型,但是int 数据不能自动转换为枚举
  • 对一个不适当的整形进行强制转化,结果是不确定的

4.6.2 枚举取值范围

在这里插入图片描述

  • 枚举的上限:找出枚举常量的最大值,找到大于该值的最小二次幂,然后减一
  • 枚举的下线:如果枚举常量的最小值大于0,下限为0,如果最小值小于0,将该值取反变成正数,通过找到最小大于该正数的二次幂,减一后再取反就是下限
  • 枚举的大小由编译器决定

4.7 指针和自由存储空间

在这里插入图片描述

  • 变量的三种属性
    • 变量的数值
    • 变量存储的地址
    • 变量存储数值的类型
  • 通过&变量名获得变量的地址,存放该地址的变量称为指针变量
  • 通过*变量名获得地址为该变量值的内容
  • cout输出地址时以十六进制输出

4.7.1 声明和初始化指针

在这里插入图片描述

  • 指针声明时必须指定指针所指向的数据类型
  • 指向不同类型数据的指针在同一个计算机系统上的大小是相等的

4.7.2 指针的危险

在这里插入图片描述

4.7.3 指针和数字

在这里插入图片描述

4.7.4 使用new来分配内存

在这里插入图片描述

  • 指针变量可以存储没有名称的数据对象:数据项的内存块的地址
  • new在运行时为数据对象分配内存
  • new分配的内存块在堆上

4.7.5 使用delete释放内存

在这里插入图片描述

  • delete的用法和free的用法一样
  • 只能将动态开辟的其实地址delete
  • 只能将动态开辟的内存delete一次
  • delete只能释放new分配的内存
  • new后没有delete,可能导致内存泄漏
  • delete 空指针是安全的

4.7.6 使用new来创建动态数组

在这里插入图片描述

  • 编译时为数组分配内存称为静态联编
  • 运行时为数组分配内存称为动态联编
  • 使用new[element_number]动态开辟数组
  • 不要使用delete来释放不是new分配的内存。
  • 不要使用 delete释放同一个内存块两次。
  • 如果使用new[]为数组分配内存,则应使用 delete[]来释放。
  • 如果使用new[]为一个实体分配内存,则应使用 delete(没有方括号)来释放。
  • 对空指针应用 delete 是安全的。
  • 动态开辟的数组可以通过指针来访问
  • 数组名是常量,指针是变量

4.8 指针、数组、和指针的算术

在这里插入图片描述

4.8.1 程序说明

在这里插入图片描述

4.8.2 指针小结

在这里插入图片描述

4.8.3 指针和字符串

在这里插入图片描述

  • 如果给cout提供字符的地址,那么它就会从该字符开始打印,直到遇见结束符,如果像显示该字符的地址,必须将该地址进行强制类型转换为其他类型地址
  • C++中,用双引号括起来的字符串和数组名一样代表首元素地址
  • 不可以修改字符串常量
  • 将字符串读入程序中,应使用已分配的内存地址
  • 只有初始化字符数组时才可以使用=,否则应该使用strcpy

4.8.4 使用new创建动态结构

在这里插入图片描述

使用new可以节省内存

4.8.5 自动存储、静态存储、动态存储

在这里插入图片描述

  • 在函数内部定义的常规变量使用自动存储,随着函数结束自动销毁
  • 在函数外面定义的或者使用static定义的变量使用静态存储,程序结束会自动销毁
  • new开辟的空间使用到你动态存储,什么时候delete什么时候销毁

4.9 类型组合

在这里插入图片描述

4.10 数组的替代品

4.11 模板类vector

在这里插入图片描述

  • vecotr类需要引用头文件
  • vector包含在名称空间std中
  • vector语法vector<type_name>vt(n_elem)
  • vector对象的元素个数可以是变量
  • vector对象是动态存储分配

4.10.2 模板类array(C++11)

在这里插入图片描述

  • array类需要引用头文件
  • array位于名称空间中
  • array语法array<type_name, n_elem>va
  • array对象的元素个数是常量
  • array使用栈(静态分配内存)

数组、vector对象、array对象区别

在这里插入图片描述

  • vecotrarray会对索引值检查是否越界,但是普通数组不会
  • 普通数组和array对象在栈区vector对象在堆区

4.11 总结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_74278159/article/details/129740191