C++ Primer Plus学习笔记:关键概念解析

需积分: 10 3 下载量 34 浏览量 更新于2024-07-18 收藏 38KB DOCX 举报
"C++学习笔记,涵盖预编译指令、内存对齐、位域结构体、全局变量与枚举等核心概念。" 在深入探讨C++编程时,我们首先遇到的是预编译指令,这些指令在实际编译之前由预处理器处理。`defined`是一个预编译指令,用于检查宏是否已被定义。例如,`defined(WIN32)`会返回一个布尔值,表示当前环境中是否存在`WIN32`这个宏定义。在条件编译中,`#ifdef`和`#endif`用于包含或排除特定代码块,这里展示了如何结合`defined(WIN)`和`defined(WIN32)`来控制代码的编译。 `#pragma once`是另一个预编译指令,它确保一个头文件只被编译一次,防止因多次包含同一头文件导致的问题。这与传统的`#ifndef`、`#define`和`#endif`头文件保护机制相似,但更简洁且在大多数现代编译器中得到支持。 内存对齐是C++中一个重要的优化策略。`#pragma pack(n)`允许我们指定结构体成员的对齐方式,`n`表示字节数。这有助于控制结构体的存储布局,例如在网络协议结构体中,我们可能希望所有成员都按照网络字节序(通常为1字节对齐)排列。结构体内存对齐遵循三个原则:1) 结构体大小能被其最大基本类型成员大小整除;2) 每个成员的偏移量是其大小的整数倍;3) 结构体总大小为最大基本类型成员的整数倍。 位域结构体是C++中一种特殊的结构,允许我们将内存按位分配给结构体成员。这在处理位标志或高效存储数据时非常有用。位域遵循的规则包括:1) 基本单位长度由最大的位域成员决定;2) 成员紧挨存放,跨单位的成员移到下一个单位;3) 位域长度不超过自身类型的最大比特位数;4) 不使用`#pragma pack`时,位域长度为基本单位的整数倍,而使用时,长度为指定的`n`的整数倍。 C++和C在全局变量的处理上有所不同。在C++中,非静态全局变量默认具有外部链接,不能在同一作用域内再次声明,否则会导致链接错误。因此,全局变量通常在单个源文件中定义,并在头文件中用`extern`声明。而在C语言中,`extern`修饰全局变量是可选的,因为多个文件定义同名非静态全局变量会被视为同一变量,不会引发链接冲突。 枚举在C++中是一种强大的常量定义工具,但枚举变量不支持算术运算。枚举变量可以隐式提升为整型,但整型不能直接赋值给枚举变量,除非使用显式类型转换。C++11之后,可以将任何整数值赋给枚举变量,只要该值在枚举的取值范围内,这增强了枚举类型的灵活性。 类型转换在C++中分为静态转换和动态转换,静态转换(如`static_cast`)在编译时完成,而动态转换(如`dynamic_cast`)在运行时进行,通常用于多态类型之间的转换。这些转换在处理不同类型的对象交互时非常关键。 这份C++学习笔记涵盖了从预处理到内存管理,再到类型转换等多个核心主题,对于熟悉和复习C++语言的各个方面都非常有帮助。