c++学习(一)
基本数据类型
类型 | 关键字 | 描述 | 所占字节数 | 最大值 | 最小值 |
---|---|---|---|---|---|
布尔型 | bool | 存储值 true 或 false | bool | 1 | 0 |
字符型 | char | 通常是一个八位字节(一个字符)。这是一个整数类型 | 1 | ||
整型 | int | 对机器而言,整数的最自然的大小 | 4 | 2147483647 | -2147483648 |
浮点型 | float | 单精度浮点值。单精度是这样的格式,1 位符号,8 位指数,23 位小数。 | 4 | 3.40282e+38 | 1.17549e-38 |
双浮点型 | double | 双精度浮点值。双精度是 1 位符号,11 位指数,52 位小数。 | 8 | 1.79769e+308 | 2.22507e-308 |
无类型 | void | 表示类型的缺失。 | |||
宽字符型 | wchar_t | wchar_t 宽字符类型。2 或 4 | 2147483647 | -2147483648 |
修饰符
C++ 允许在 char、int 和 double 数据类型前放置修饰符,可以使用一个或多个类型修饰符进行修饰
修饰符 | 可修饰 |
---|---|
signed | 整型、字符型 |
unsigned | 字符型 |
short | 整型 |
long | 双精度型 |
可以使用速记符号来声明无符号短整数或无符号长整数。可以不写 int,只写单词 unsigned、short 或 unsigned、long,int 是隐含的。例如,下面的两个语句都声明了无符号整型变量。
unsigned x; unsigned int y;
定义常量
- 使用 #define 预处理器。
- 使用 const 关键字。
#define A 1; //or const int B = 2; //也可以修饰指针 const int *p = &B; //=== int const *p = &B; //或者直接修饰p int *const p = &B;
⚠️ 最好把常量定义为大写字母形式,
C++ 存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。
- auto
- register
- static
- extern
- mutable
- thread_local (C++11)
⚠️ 从 C++ 11 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。
auto
auto 用于声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符
register
register 用于定义存储在寄存器中而不是 RAM 中的局部变量
定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
static
static 保持局部变量的存在,不需要在每次它进入和离开作用域时进行创建和销毁,static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内
extern
extern 用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
这里有个疑问,全局变量的值在程序的整个生命周期内都是有效的,这个是指只能在生命它的文件内还是对所有文件起效? 那么 extern 和 static 修饰全局变量的功能不是有一个多余的吗?
thread_local
使用 thread_local 声明的变量仅可在它在其上创建的线程*问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
thread_local 说明符可以与 static 或 extern 合并。
可以将 thread_local 仅应用于数据声明和定义,thread_local 不能用于函数声明或定义。