C++ 基础¶
变量¶
声明¶
new与delete¶
- 使用
delete[]释放new[]申请的内存 - 不要释放已经释放的内存
- 对空指针使用delete是安全的。
new¶
单值变量的列表初始化
int *pin = new int{ 6 };
new失败时引发std::bad_alloc异常,在旧的标准中返回空指针。
定位new运算符(placement new)¶
手动指定分配的内存起点,而不是在堆中自动管理。不跟踪已使用哪些内存,不能使用delete释放(因为delete只能释放自动分配的内存)。
char buf[200];
int *p = new(buf) type_name;
命名规范¶
| 风格 | 范围 |
|---|---|
PascalCase | 全局变量、函数、类 |
camelCase | 局部变量 |
snake_case | 文件名 |
基本数据类型¶
- 在
climits和cfloat头文件中定义了整型和浮点型的值域信息。
sizeof()¶
sizeof()以字节为单位给出类型的内存大小。sizeof()的返回值是一个size_t类型,它可能是unsigned int或unsigned long的同义词- 使用
printf()打印sizeof()运算结果时,可以使用%zd或%zx等说明符。
printf("Long类型的占用%zd字节。", sizeof(long));
整型 short, int(long), long long¶
| 整数字面值 | 数据类型 |
|---|---|
| 32 | int |
| 32L | long |
| 32LL | long long |
| 32U | unsigned int |
| 32UL | unsigned long |
| 32ULL | unsigned long long |
| 浮点数字面值 | 数据类型 | 备注 |
|---|---|---|
| 32.64, .32, 0.32 | double | 默认情况下浮点数字面值总是被当作double类型。 |
| 32.F | float | 只有使用F后缀的字面值才被当作float类型。 |
| 3.2e3 | double | 值为3.2 × 10³ |
| 0xA.BCp10 | double | 十六进制浮点数,十进制值为(10 × 16⁰ + 11 × 16⁻¹ + 12 × 16⁻² ) × 2¹⁰。 |
注:
- 没有八进制浮点数。
- 对于十六进制浮点数,幂采用以**2为底的十进制数**。
整型进位制¶
| 进位制 | 前缀 | 例子 |
|---|---|---|
| 十进制(**DEC**imal) | N.A. | 12 |
| 八进制(**OCT**al) | 0 | 014,等于十进制数12 |
| 十六机制(**HEX**adecimal) | 0x 或 0X | 0xC,等于十进制数12 |
字符型 char¶
| 字面值 | 类型 | 字符 |
|---|---|---|
99, 0143 或 0x63 | 整型数值 | c |
'c' | 字符字面值 | c |
'\n' | 转义字符 | (换行) |
'\0143' 或 '\143' | 转义字符,格式为\0ooo或\ooo(其中ooo为八进制数) | c |
'\x63' 或 '\0x63' | 转义字符,格式为\xhh,其中hh为十六进制数 | c |
字符转义序列:
- 八进制字符
\ooo - 十六进制字符
\xhhh - Unicode字符
\u00000000
宽字符类型 wchar_t、char16_t和char32_t¶
wchar_t bob = L'P';
wcout << L"tall" << endl; // 宽字符常量和宽字符串L前缀
char16_t ch1 = u'q';
char32_t ch2 = U'\U0000222B';
注:
- 在MSVC编译器里,
wchar_t是UTF-16LE字符(Windows平台原生字符),char16_t是UTF-16字符,char32_t是UTF-32字符。
字符串类型 cstring(Null Terminated String)¶
字符串以空字符('\0')结束。在使用scanf()读取字符串以及使用字符串字面值,以及使用printf()打印字符串时,空字符会被自动处理。
原始字符串¶
默认定界符 R"(... )"
自定义定界符可在默认定界符之间加入除空格、括号、斜杠、控制字符(制表符等)之外的任意字符。 例如 R"delimiter(... )delimiter"
强制类型转换¶
(type)name
type(name)
static_cast<type>(name)
复合数据类型¶
列表初始化数组时可以省略等号,可不在大括号内包含任何东西即可将所有元素置零。
位字段¶
struct torgle_register
{
unsigned int SN: 4;
unsigned int : 4; // 不使用的位
bool goodIn : 4;
bool goodTorgle: 4;
};
共用体/联合 Union¶
匿名共用体:
struct widget
{
char brand[20];
int type;
union
{
long id_num;
char id_char[20];
}
}
枚举¶
枚举类型可用于创建符号常量(新的类型名和枚举量),可用枚举来定义switch语句中的符号常量。
定义的符号常量在枚举的作用域内有效。
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
spectrum band = spectrum(3); // green
spectrum band = green;
可以创建多个值相同的枚举量
每个枚举都有取值范围,可以将枚举变量中的任何整数值赋给枚举变量,即使这个值不是枚举值。
枚举的取值范围的计算:开区间,(min(比最小枚举值小的最大的2的幂次, -1), 比最大枚举值大的最小的2的幂次)