基本内置类型
算数类型
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8 位 |
wchar_t | 宽字符 | 16 位 |
char16_t | Unicode字符 | 16 位 |
char32_t | Unicode字符 | 32 位 |
short | 短整型 | 16 位 |
int | 整型 | 16 位 |
long | 长整型 | 32 位 |
long long | 长整型 | 64 位 |
float | 单精度浮点数 | 6 位有效数字 |
double | 双精度浮点数 | 10 位有效数字 |
long double | 扩展精度浮点数 | 10 位有效数字 |
char 为基本的字符类型,应可存放机器字符集中任意字符对应的数字。故char 的大小和一个机器字节相同。wchar_t、char16_t、char32_t用于扩展字符集,保证可存放机器扩展字符集中的字符。
整型可通过前置unsigned 关键字得到对应的无符号类型,默认整型类型都是带符号的。字符型被分为了三种会决定char 是带符号的或是不带符号的。
类型转换
-
算数类型->非布尔类型,非零为真,零为假。反之真为1,假为0。
-
浮点->整型,去小数点部分。
-
整数->浮点,小数部分为0。
-
无符号类型数值超范围时,值为类型最大值取模后的余数。 unsigned char c = -1 // c = 255
-
有符合数超范围时,值为未定义的(undefined)。
含有无符号的表达式(切勿混用)
无符号与有符号数运算后的值类型为无符号数。
int main() {
unsigned u = 10;
int i = -42;
auto a = u+i; // unsigned int
std::cout << a << std::endl;
return 0;
}
// 4294967264
字面值常量
20 十进制、0开头八进制、0x开头16进制。
指定字面值类型,字符和字符串字面值:
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode 16 字符 | char16_t |
U | Unicode 32 字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8 | char0 |
整型字面值:
后缀 | 最小匹配类型 |
---|---|
u or U | unsigned |
l or L | long |
ll or LL | long long |
浮点型字面值:
后缀 | 类型 |
---|---|
f 或 F | float |
l 或 L | long double |
变量
变量定义
初始化:创建变量时赋予初始值。赋值:擦除对象当前值,以新值替代。
初始化的四种方式:
int a = 0;
int a = {0};
int a{0};
int a(0);
使用{}初始化的方式称为:列表初始化。使用列表初始化时,编译器会检查是否有存在丢失信息的风险,若存在则会报错,使用()会进行自动转换。
变量的声明与定义
c++支持分离式编译,允许将程序分割为若干文件,每个文件可独立编译。
声明:使此变量可被其他文件使用。定义:创建此变量关联的实际内容。
声明变量通过extern关键字,若声明的同时进行了初始化,此声明即为定义。变量只能被定义一次,但可以多次声明。故其他文件使用 i 时,只可声明(extern int i) 不可再次定义(int i)。
#include <iostream> extern int i; // 声明 i int i; // 声明并并定义 i extern double pi = 3.14; // 定义 int main() { std::cout << i << std::endl; std::cout << pi << std::endl; } // 0 // 3.14
标识符
c++标识符由字母、数字和下划线组成。
关键字
alignas c++11:指定对象或类型的对齐方式 | continue | friend 友元,允许一个函数或类访问另一个类的私有成员 | register 建议将变量存储在寄存器中 | true |
---|---|---|---|---|
alignof 获取类型的对齐要求 | decltype 获取表达式的类型 | goto 无条件跳转 | reinterpret_cast 强制类型转换 | try |
asm 嵌入汇编代码 | default | if | return | typedef |
auto | delete 删除对象或释放内存 | inline 声明内联函数 | short | typeid 获取对象的类型信息 |
bool | do | int | signed | typename 在模板中使用,依赖名称是一个类型 |
break | double | long | sizeof | union |
case | dynamic_cast 在继承中进行动态类型转换 | mutable 允许在 const 对象中修改成员 | static | unsigned |
catch | else | namespace | static_assert | using |
char | enum | new | static_cast | virtual 声明虚函数或在派生类中覆盖虚函数 |
char16_t | explicit | noexcept | struct | void |
char32_t | export 在C++11:已经废弃,曾用于模板的导出 | nullptr | switch | volatile 指示变量可能在未经通知的情况下被修改 |
class | extern | operator 重载运算符 | template 定义模板 | wchar_t |
const | false | private | this | while |
constexpr | float | protected | thread_local | const_cast |
for | public | throw |
操作符替代名
and (&&) | bitand (&) | compl (~) | not_eq (!=) | **or_eq (|=) | xor_eq (^=) 按位异或赋值 |
---|---|---|---|---|---|
and_eq (&=) | bit_or (|) | not (!) | or (||) | xor (^) 按位异或 |
复合类型
复合类型是基于其他类型定义的类型。
引用
引用(这里指左值引用)为对象起了另一个名字,使用&d的形式来定义,d为声明的变量名。引用并非对象,只是为已存在的对象所起的另一个名字。
引用必须初始化,且只能绑定在对象上,不能与字面值或表达式结果绑定。
int main() {
int val = 1024;
int &refVal = val;
std::cout << val << std::endl;
std::cout << refVal << std::endl;
refVal = 5; // 实际上是在修改绑定对象的值
std::cout << val << std::endl;
int i = refVal; // 实际上是获取绑定对象的值
std::cout << i << std::endl;
}
// 1024
// 1024
// 5
// 5
指针
指针同引用类似,也实现了对其他对象的间接访问。但二者有很多不同之处:1.指针本身就是一个对象,允许对其赋值和拷贝,可先后指向不同对象。2.指针允许不赋初值,但这样会有一个不确定的值。
通过取地址符(操作符&)获取对象地址来存放。因引用不是对象,故无法定义指向引用的指针。
通过解引用符(操作符*)来访问对象。
指针的值(地址)应为下列4种状态之一:
-
指向一个对象。
-
指向紧邻对象所占空间的下一个位置。
-
空指针,意味着指针没有指向任何对象。
-
无效指针,也就是上述情况之外的其他值。
void* 指针
void* 指针是一种特殊的指针类型,可用于存放任意对象的地址。只能用于与别的指针比较、作为函数的输入或输出,或者赋给另一个void* 指针。不能操作void*指针所指的对象,因为不知其对象类型。
复合类型声明
int i = 1024, *p = &i, &r = i;
// i int, p int 指针, r int 引用
int* p1, p2;
// p1 int 指针, p2 int。 *仅修饰 p
int *p3, **pi;
// p3 int 指针, pi 指向 int 指针 的指针
文章评论