Skip to main content

基础

函数

构造函数

析构函数

在对象销毁前系统会自动调用, 进行清理工作, 例如收回创建对象时申请的内存空间

字符串

严格来说, C++没有内置的字符串类型 可用于存储字符的类型:

  1. char: 存储ASCII的字符
  2. 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
typeidtypeid(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

有符号整型

名称关键字范围字节数备注
布尔型bool0~11
字符型char-128~1271无需转换为 UNICODE 的 ASCII 字符
字符型wchar_tUNICODE格式编码的"宽"字符,win为UTF-16
char16_t对应UTF-16编码
char32_t对应UTF-32编码
小整型signed char-128~1271
短整型short-32768~327672
整型int-2147483648~21474836472
-2147483648~21474836474
长整型long-2147483648~21474836474
+-92233720368547758088
超长整型long long(c++11)+-184467440737095516158表示更大的整数值范围

无符号整型

名称关键字范围字节数备注
unsigned char0~2551C++ 没有内置字节类型。 使用 unsigned char 来表示字节值
unsigned short0~655352
unsigned int0~655352位标志的默认选项
0~42949672954
unsigned long0~42949672954
unsigned long long(c++11)0~184467440737095516158

整型类型后缀

![[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;

}