CS C++ Code

前言

笔者觉得自己C++语法太差,还停留在只有竞赛够用的垃圾水平,于是决定恶补

Fake C++
Real C++

实际上是笔者现在连OOP都看不懂

基本语法

enum 枚举

适合用来定义一组有限、离散的常量,如状态机、错误码、类型分类等

1
2
3
4
5
6
enum Level
{
LOW,
MEDIUM,
HIGH
};

默认的话,会分配给第一个变量low一个下标0,然后第二个变量就会有下标1,以此类推,比如

1
2
enum Level myLevel = MEDIUM;
cout << myLevel << endl; // 输出 1

如果想改变下标,有两种方式:

  1. 给每个变量都分配下标
1
2
3
4
5
6
enum Level
{
LOW = 10,
MEDIUM = 50,
HIGH = 100
};
  1. 给一个变量分配下标,然后接下来的会根据这个下标递增
1
2
3
4
5
6
enum Level
{
LOW = 5,
MEDIUM, // = 6
HIGH // = 7
};

一般来说,enum会配合switch使用

1
2
3
4
5
6
7
8
9
10
11
12
13
enum Level myLevel = MEDIUM;
switch(myLevel)
{
case 1:
cout << "Low Level" << endl;
break;
case 2:
cout << "Medium Level" << endl;
break;
case 3:
cout << "High Level" << endl;
break;
}

&

引用
1
2
int a = 1;
int& b = a; // b 是对 a 的引用

这个时候,ab共用一个地址,改变一个会影响另一个的数值,因为本质上是一样的,可以理解为别名

1
2
b = 2;
cout << a << endl; // 输出 2

值得一提的是,虽然三种写法int& aint &aint & a是等价的,但一般来说工程项目会使用第一个

注意

int& a, b中,只有a是引用,b还是普通的int变量,因为&只绑定到当前变量!

取地址

如题,就是取地址符号

在C++中,当一个变量被声明,会分配给其一个内存地址,&就可以取这个变量的地址,是十六进制格式

1
2
int a = 1;
cout << &a << endl; // 输出类似于0x7ffc05b39ebc的地址

*

指针

指针是存储内存地址的变量

1
2
3
4
5
int a = 1;
int* b = &a;
cout << a << endl; // 输出 1
cout << &a << endl; // 输出 0x7ffdb27a660c
cout << b << endl; // 输出 0x7ffdb27a660c

&一样,声明指针也推荐用int* a,而不是int *aint * a,并且指针的变量类型也要跟原变量相同

解引用

前面我们用指针变量存储了另一个变量的地址,我们也可以继续用*得到这个地址的变量的值,称为解引用

1
2
3
int a = 1;
int* b = &a;
cout << *a << endl; // 输出 1
修改指针的值
1
2
3
4
5
int a = 1;
int* b = &a;
*b = 2;
cout << *b << endl; // 输出 2
cout << a << endl; // 输出 2

内存管理

new

new可以分配一个新的内存地址

1
2
3
4
5
6
int* a = new int;
cout << a << endl; // 输出 0x61a8ce8b2eb0
cout << *a << endl; // 输出 0
*a = 1;
cout << a << endl; // 输出 0x61a8ce8b2eb0
cout << *a << endl; // 输出 1
delete

delete可以释放这个内存地址

1
2
3
4
5
int* a = new int;
cout << a << endl; // 输出 0x61a8ce8b2eb0
cout << *a << endl; // 输出 0
delete a;
cout << *a << endl; // 乱码,因为是被释放了
注意

delete只能用于释放被new声明的内存,否则会出现segmentation fault

下面这个操作是错的,因为a++改变了指针a的指向,它不再指向之前被new的那个内存地址,而且新的内存地址不能被delete,因为你没有“合法”地拥有它

1
2
3
int* a = new int;
a++;
delete a; // 会报错 core dumped

本站由 Sky Zhou 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
© Copyright skyzhou.top
All Rights Reserved