图片由 AI 生成
《C++程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记
1、基本数据类型(Fundamental Types)
1.1、数据类型的作用
数据类型规定了数据在计算机内存中存放的格式以及对这些数据所能施加的操作,这样可以有效地提高数据管理的准确性,减少数据操作中错误的发生
1.2、常用的 C++ 数据类型
整数类型(Integer Types)
- int:标准整数类型,通常为 32 位。
- short:短整数类型,通常为 16 位。
- long:长整数类型,通常为 32 位或 64 位(依赖于平台和编译器)。
- long long:更长的整数类型,通常为 64 位。
- unsigned int、unsigned short、unsigned long、unsigned long long:无符号版本,不允许负数。
浮点类型(Floating-point Types)
- float:单精度浮点类型,通常为 32 位。
- double:双精度浮点类型,通常为 64 位。
- long double:扩展精度浮点类型,通常为 80 位、96 位或 128 位(依赖于平台和编译器)。
字符类型(Character Types)
- char:字符类型,通常为8位。
- signed char:有符号字符类型。
- unsigned char:无符号字符类型。
- wchar_t:宽字符类型,用于支持宽字符集(如Unicode)。
- char16_t:16位字符类型。
- char32_t:32位字符类型。
布尔类型(Boolean Type)
- bool:布尔类型,取值为true或false。
数据类型
指针类型(Pointer Types)
- int*:指向int类型的指针。
- double*:指向double类型的指针。
- char*:指向char类型的指针,常用于字符串。
引用类型(Reference Types)
- int&:int类型的引用。
- const int&:对int类型的常量引用。
用户定义类型(User-defined Types)
- 类(Class Types)
- 结构体(Struct Types)
- 联合(Union Types)联合允许在相同的内存位置存储不同的数据类型。
- 枚举(Enumeration Types)
类型修饰符(Type Modifiers)
- signed:有符号类型(默认情况)
- unsigned:无符号类型。
- short:短类型。
- long:长类型。
- const:常量类型,变量值不可更改。
- volatile:告诉编译器该变量可能会被程序之外的因素改变。
类型别名(Type Aliases)
- C++11引入了
using
关键字来定义类型别名
自动类型推导(Auto Type Deduction)
- C++11引入了
auto
关键字,让编译器自动推导变量的类型
decltype 类型推导
- C++11还引入了
decltype
关键字,用于查询表达式的类型
Q:结构体和联合数据类型之间有什么区别和联系?
区别:
联系
long double > double > float > long > int > short > char
2、常量
2.1、常量的特点
定义与表示
- 固定值:常量是程序中的固定值,在程序执行期间不会发生改变。这些固定的值也被称为字面量。
- 数据类型:常量可以是任何基本数据类型,包括整型数字、浮点数字、字符、字符串和布尔值。
- 定义方式:
- 使用
#define
预处理器指令定义符号常量。 - 使用
const
关键字定义常量变量(即具有常量属性的变量)。 - 使用
enum
关键字定义枚举常量,枚举常量是一组具有命名值的符号常量。
- 使用
特性与用途
- 不可修改性:一旦常量被定义并初始化,其值就不能在程序中被修改。这有助于提高程序的安全性和稳定性。
- 作用域:常量的作用域与普通变量的作用域相同,可以根据需要定义在全局、命名空间、类或函数内部。
- 类型安全性:使用const关键字定义的常量具有类型安全性,编译器会在编译阶段进行类型检查。而使用#define定义的符号常量则没有类型区别,只是简单的文本替换。
- 内存分配:const常量在程序运行时会进行内存分配,并存储在数据段中。而 #define 定义的符号常量则不会分配内存,只是在预处理阶段进行文本替换。
- 提高代码可读性:使用具有描述性的常量名代替直接出现的数值或字符,可以使代码更加清晰易懂,便于维护和调试。
使用注意事项
- 初始化:const常量在定义时必须初始化,否则会导致编译错误。而#define定义的符号常量则不需要初始化,因为它只是文本替换。
- 常量表达式:只有用常量表达式初始化的常量,才能成为常量表达式。常量表达式在编译时就能确定其值,因此可以用于数组大小、枚举值、constexpr变量等需要编译时常量的场景。
- 指针与常量:指向常量的指针和常量指针在C++中有不同的含义和使用场景。指向常量的指针不能用于修改其所指向的常量值;而常量指针则是指针本身的值(即存储的地址)不能被修改,但其所指向的值可以被修改(除非该值也是常量)。
2.2、数值常量的表示
整形常量
- 十进制:默认情况下,整数常量是十进制的。例如,123。
- 八进制:以0(零)开头表示八进制数。例如,015表示八进制数,等于十进制的13。
- 十六进制:以0x(零叉)或0X开头表示十六进制数。例如,0x1A表示十六进制数,等于十进制的26。
- 二进制(C++11及以后):以0b(零b)或0B开头表示二进制数。例如,0b1010表示二进制数,等于十进制的10。
- 长整型:在整数常量后加L或l表示长整型(long)。例如,123L。对于long long类型,使用LL或ll后缀。例如,123456789012345LL。
- 无符号整型:在整数常量后加U或u表示无符号整型(unsigned)。例如,42u。对于无符号长整型,可以组合使用UL、Lu、uL、llU 等后缀。
浮点数常量 / 实数常量
- 十进制表示:例如,3.14、0.001。
- 科学计数法:使用 e 或 E 表示10的幂。例如,1.23e4 表示 1.23 * 10^4,即 12300.0。
- 浮点数类型后缀:f 或 F 后缀表示 float 类型,l 或 L 后缀表示 long double 类型(如果没有后缀,默认为 double 类型)。例如,3.14f 是 float类型,3.14L 是 long double 类型。
3.
表示 3.0
,.123
表示 0.123
整数部分和小数部分不能同时省略
2.3、字符常量
字符和字符串常量
- 字符常量:用单引号括起来的单个字符。例如,‘A’、‘\n’(换行符)。占一个字节
- 字符串常量:用双引号括起来的字符序列。例如,“Hello, World!”。字符串常量实际上是一个字符数组,以空字符’\0’结尾。
- 宽字符和宽字符串常量:用L前缀表示宽字符(wchar_t类型)和宽字符串(wchar_t数组)。例如,L’A’、L"Hello"。
- 原始字符串字面量(C++11及以后):用 R 前缀和双引号括起来,可以包含转义序列而不进行转义。例如,
R"(Hello, \"World!\")"
表示字符串"Hello, \"World!\""
(注意,这里的双引号是字符串内容的一部分,而不是结束符)。不过,原始字符串字面量通常用于包含文件路径等不需要转义的场景。 - 多行字符串字面量(C++11及以后):虽然C++标准没有直接提供多行字符串字面量的语法,但可以使用原始字符串字面量结合适当的格式来实现多行字符串(尽管每行末尾仍然需要一个双引号和一个括号)。或者,可以使用字符串连接(+运算符或相邻字符串字面量的拼接)来创建多行字符串。
- 用户定义的文字后缀(C++11及以后):允许为整数、浮点数、字符和字符串字面量定义自定义的后缀,以支持新的字面量类型或进行类型转换。这通常通过模板元编程和constexpr函数来实现。例如,可以定义一个后缀来表示以米为单位的浮点数常量。
转义字符
- \n:换行符。将光标移动到下一行的开头。ASCII 100
- \t:水平制表符(Tab)。将光标移动到下一个制表位。
- \v:垂直制表符。在某些文本编辑器中,它可能表示垂直方向的空格或换行。
- \b:退格符。将光标向左移动一个字符位置(在某些情况下可能不起作用)。
- \r:回车符。将光标移动到当前行的开头(在某些情况下,它可能与\n结合使用以表示新行)。
- \f:换页符。将光标移动到下一页的开头(在大多数现代文本编辑器中,这通常不会改变显示)。
\\
:反斜杠字符本身。由于反斜杠用于引入转义字符,因此需要使用两个反斜杠来表示一个实际的反斜杠。\'
:单引号字符。用于在字符常量中表示单引号。\"
:双引号字符。用于在字符串常量中表示双引号。\?
:问号字符。在大多数情况下,问号不需要转义,但在某些特定的上下文中(如正则表达式或字符串字面量中的某些模式匹配),可能需要使用?来避免歧义。- \a:警报(蜂鸣)符。在某些系统上,它会使计算机发出蜂鸣声。
- \x 后跟一个或多个十六进制数字:表示一个十六进制值的字符。例如,\x41 表示字符 ‘A’。
- \0 或 \000:空字符(null character)。它用于表示字符串的结束。
- \ddd:其中 ddd 是一个或多个八进制数字(最多三个),表示一个八进制值的字符。例如,\101 表示字符 ‘A’。
- \xhh:1~2位十六进制数所表示的字符0
转义字符只表示一个字符,在内存中只占一个字节
\n
也可以表示成 \012
或者 \x0a
我们也可以把字符常量看成是整型量,或者说每个字符常量都对应一个整型数值,即它的 ASCII 编码值
看看下面的例子
3、变量
3.1、变量的定义
变量类型、变量名称、变量值和变量地址
[存储类型] type variable_name [= initial_value];
- 存储类型即为
auto
、regiester
、static
、extern
之一,缺省时,编译器将根据对该变量的作用域,为该变量指定相应的存储类型 - type:这是变量的数据类型,它决定了变量可以存储什么类型的数据。例如,int 表示整数,float 表示浮点数,char 表示字符,等等。
- variable_name:这是变量的名称,它是一个标识符,用于在代码中引用该变量。变量名必须遵循C++的标识符命名规则,通常以小写字母或下划线开头,后跟字母、数字或下划线。
- [= initial_value]:这是可选的初始值部分。如果提供了初始值,则变量在定义时会被初始化为该值。如果未提供初始值,则变量的初始内容是未定义的(对于基本类型)或依赖于类的默认构造函数(对于对象类型)。
eg
int a;
char c;
float b=3.0;
定义局部变量时不赋初始值,则变量初值不确定
定义全局变量时不赋初始值,则变量初始值为 0
3.2、标识符的命名规则
变量名、函数名、数据名等都是标识符
标识符可由字母、数字、下划线 3 种字符组成
必须以字母或者下划线开头,后面接若干个字母、下划线或数字
变量名不能与 C++ 关键字相同
C++ 的关键字
auto 自动类型推断
bool 布尔类型
break 跳出当前循环或switch语句
case switch语句中的一个案例分支
catch 捕获异常块
char 字符类型
char16_t 16位Unicode字符
char32_t 32位Unicode字符
class 定义一个类
const 定义常量或常量表达式
constexpr 定义编译时计算的常量表达式
const_cast 移除对象的常量性
continue 跳过当前循环的剩余部分,直接进行下一次循环
decltype 查询表达式类型
default switch语句的默认分支或定义默认构造函数
delete 删除分配的内存或禁用特殊成员函数
do do-while循环的开始
double 双精度浮点数类型
dynamic_cast 安全地转换指针或引用的类型
else if语句的替代条件分支
enum 定义枚举类型
extern 声明一个变量或函数是在其他地方定义的
explicit 阻止构造函数的隐式自动类型转换
false 布尔字面量false
float 单精度浮点数类型
for 循环控制语句
friend 允许其他类或函数访问私有和保护成员
goto 无条件跳转语句
if 条件语句
inline 建议编译器内联函数
int 整数类型
long 长整型数据类型
mutable 允许const对象的成员被修改
namespace 定义一个命名空间
new 动态内存分配
noexcept 指示函数不抛出异常
nullptr 空指针字面量
operator 定义或重载操作符
private 类的访问修饰符,私有成员
protected 类的访问修饰符,受保护成员
public 类的访问修饰符,公开成员
register 建议编译器将变量存储在寄存器中(已废弃)
reinterpret_cast 重新解释类型的强制类型转换