基础
函数
构造函数
析构函数
在对象销毁前系统会自动调用, 进行清理工作, 例如收回创建对象时申请的内存空间
字符串
严格来说, C++没有内置的字符串类型 可用于存储字符的类型:
- char: 存储ASCII的字符
- wchar_t: 存储UNICODE的字符
运算
比较
- int最大值: INT_MAX
- int(1字节, 8位): INT8_MAX
- int(2字节,16位): INT16_MAX
- int(4字节,32位): INT32_MAX
- int(8字节,64位): INT64_MAX
- LLONG_MAX
- ULLONG_MAX
优先级
换行区分优先级, 优先级高则优先计算, 同级则按照结合性计算
高优先级 | 说明 | 示例 | 结合性 |
---|---|---|---|
:: | 作用域运算符 | ||
++ | 后缀 | ||
-- | 后缀 | ||
(表达式) | 优先级分组 | (1+2)*3 | |
() | 值构造 | int(32) | |
() | 函数调用 | fun(1) | |
[] | 下标运算 | [3] | |
. | 结构体 | st.talk() | |
-> | 指针 | p.talk() | |
const_at | 专用类型转换 | ||
dynamic_cast | |||
reinterpeet_cast | |||
static_cast | |||
typeid | typeid(a).name() | ||
co_await | |||
++ | 前缀 | ||
-- | 前缀 | ||
+ | |||
- | |||
~ | 按位运算 | ||
! | |||
sizeof | 求字节数 | ||
sizeof | |||
noexcept | |||
alignof | |||
* | 内存操作符 | ||
& | 取地址 | ||
new | |||
new[] | 申请对象数组 | ||
delete | |||
delete[] | 释放数组 | ||
(type) | 强制类型转换 | ||
.* | 成员解引用 | 从右到左 | |
->* | 成员解引用 | ||
* | 乘法 | ||
/ | 整/小数取整 | ||
% | 取余 | ||
+ | |||
- | |||
>> | 位右移 | ||
<< | 位左移 | ||
> | |||
< | |||
>= | |||
<= | |||
== | 等于 | ||
!= | 不等于 | ||
& | 按位与 | ||
^ | 按位异或 | ||
| | 按位或 | ||
&& | |||
|| | |||
?: | |||
= | 从右到左 | ||
+= | |||
-= | |||
*= | |||
/= | |||
>>= | |||
<<= | |||
&= | |||
^= | |||
|= | |||
co_yield | 从右到左 | ||
throw | 异常 | ||
, | 逗号运算符 | ||
案例: |
int a = 0, b = 0, c = 0;
int d = (a = 3, b += a + 1, b + c -1,, a + b + c);
// 先算a=3
// b = 4
// b+c-1= 3,没有赋值
// a + b + c = 7, 两个逗号表达式, 最后面的生效, 最终结果d=7
cout << d << endl; // 3 4 0 7
入口函数
为什么是int
类型?
告诉操作系统程序的退出状态, 即程序的执行结果,0表示为正常退出, 1为异常
类
构造函数
什么时候使用? 为什么会有构造函数?
如果你需要访问类的 属性(变量), 那么得初始化类对象, 即编写构造函数
如何使用?
构造函数没有任何返回值, 但不能再前面添加void
, 编译器会报错, 构造函数名前不能添加任何返回值类型.
构造函数默认是无参的, 如果声明了构造函数的形参, 那么在定义时也要把实参填入
如果你需要在类里定义方法(函数), 方法需要访问类的属性(变量), 那么得初始化类对象, 即编写构造函数, 把需要访问的变量给赋值
class Person
{
public:
string name;
int age;
Person(string name, int age)
{
this->name = name;
this->age = age;
}
void talk()
{
cout << "my name is " << this->name << " and my age is " << this->age << endl;
}
};
int main()
{
Person per = Person("张三", 18);
per.talk();
}
结构体
声明并修改值:
struct Student
{
string name;
};
int main()
{
Student Zhangsan;
Zhangsan.name = "11";
}
声明类型的同时添加初始值:
注意, 值的循序必须与定义的结构体的顺序相同!
struct Student
{
string name;
int age;
};
int main()
{
Student Zhangsan{"张三",18};
}
匿名结构体
int main() {
struct {
string name;
}Zhangsan;
Zhangsan.name = "11";
}
创建一个新的结构体
struct Student
{
string name;
int age;
};
int main()
{
Student p = new Student{"xx", 19}
}
类型
Char
对于UTF-8而言, 普通类型无法满足需求, 因为普通类型无法表达变长的内存空间, 一般用char
来处理
ASCII
char x = 'a';
UNICODE UTF8 编码
说明: 使用char
只能表示UTF-8的编码表的字符范围, 在字符前加入u8
来表示UTF-8
的编码表字符
优点: 内存占用少, 常用字符只占用一个字节, 是最普遍的编码
缺点: 计算字符串长度和查找字符是一个头疼的问题, UNICODE的字符远大于UTF-8编码长度可以表示的范围, 超出字符范围时会进行可变字节长度去查找
场景: UTF-8适合划到磁盘
char x = u8'a'; // 只能表示UTF-8的编码表的字符范围
char utf8[] u8"你好世界";
UNICODE UTF-16编码
说明: 在值前使用小写 字母u
来表示UTF-16编码
优点: 可以用固定长度的编码表示大多数常见的字符, 使用广泛, python, java都使用UTF-32
缺点: 超出的字符使用特殊的编码来存储
场景: 把数据存到存储时适合使用UTF-16
char16_t char x = u'好'; // 可以正确输出 好 这个字符对应的编码编号 22909
char16_t utf16[] = u"你好世界";
UNICODE UTF-32编码
说明: 在值前使用大写字母U
来表示UTF-32编码
优点: 可以完全表示UNICODE的编码表全部字符
缺点: 占用内存空间大
char32_t x = U'好';
char32_t utf32[] = U"你好世界";
浮点型
![[img/Pasted image 20240424185928.png]]
后缀
- e/E: 表示科学计数法的
10
的二次方
,例如10E2
表示为10 * 10 * 10
- 5.: 可以忽略后面小数点的0
- 32.e-3, 即小数点向前移动3位, 即
32
有符号整型
名称 | 关 键字 | 范围 | 字节数 | 备注 |
---|---|---|---|---|
布尔型 | bool | 0~1 | 1 | |
字符型 | char | -128~127 | 1 | 无需转换为 UNICODE 的 ASCII 字符 |
字符型 | wchar_t | UNICODE格式编码的"宽"字符,win为UTF-16 | ||
char16_t | 对应UTF-16编码 | |||
char32_t | 对应UTF-32编码 | |||
小整型 | signed char | -128~127 | 1 | |
短整型 | short | -32768~32767 | 2 | |
整型 | int | -2147483648~2147483647 | 2 | |
-2147483648~2147483647 | 4 | |||
长整型 | long | -2147483648~2147483647 | 4 | |
+-9223372036854775808 | 8 | |||
超长整型 | long long(c++11) | +-18446744073709551615 | 8 | 表示更大的整数值范围 |
无符号整型
名称 | 关键字 | 范围 | 字节数 | 备注 |
---|---|---|---|---|
unsigned char | 0~255 | 1 | C++ 没有内置字节类型。 使用 unsigned char 来表示字节值 | |
unsigned short | 0~65535 | 2 | ||
unsigned int | 0~65535 | 2 | 位标志的默认选项 | |
0~4294967295 | 4 | |||
unsigned long | 0~4294967295 | 4 | ||
unsigned long long(c++11) | 0~18446744073709551615 | 8 |
整型类型后缀
![[img/1.png]]
进制
16进制
前缀0x
0xaf
0xa
8进制
前缀是0
01
010
二进制
前缀0b
0b1
0b0
0b10101
指针
定义
指针的生命方式:
int* p; // 推荐
int * p;
int *p;
案例:
int x = 3;
int* p = &x;
// or const int* p = &x;
cout << "x addr is: " << p <<endl;
使用指针
变量
int x = 3;
int* p = &x;
cout << "x num is: " << *p <<endl;
结构体
访问和修改指针的值
struct Student
{
string name;
};
int main()
{
Student Zhangsan;
Student* p = &Zhangsan;
p->name = "Zhangsan";
cout << "p name is:" << p->name <<endl;
}