C++学习篇
第一部分:C++初识
1.1 第一个C++程序
- 创建项目:使用Visual Studio作为主要工具。
- 创建文件:右键源文件,添加新项。
- 编写代码:包含基本的
main
函数框架。 - 运行程序:执行编写的代码。
1.2 注释
- 单行注释:使用
//
。 - 多行注释:使用
/* ... */
。 - 作用:添加说明,方便阅读和理解代码。
1.3 变量
- 作用:命名内存空间,便于操作。
- 语法:
数据类型 变量名 = 初始值;
。 - 注意:C++中变量必须初始化。
1.4 常量
- 宏常量:使用
#define
定义。 const
修饰的变量:使用const 数据类型 常量名 = 常量值;
。
1.5 关键字
- C++保留的单词,不可用作变量或常量名。
1.6 标识符命名规则
- 必须遵守C++的命名规范。
第二部分:数据类型
2.1 整型
- 包括
short
,int
,long
,long long
等。 - 各有特定的内存占用和取值范围。
2.2 sizeof关键字
- 用于获取数据类型或变量的内存大小。
2.3 实型(浮点型)
- 包括
float
和double
。 - 区别在于有效数字范围。
2.4 字符型
- 用于表示单个字符。
- 存储ASCII编码。
2.5 转义字符
- 用于表示无法直接显示的字符。
2.6 字符串型
- C风格字符串:使用字符数组。
- C++风格字符串:使用
string
类型。
2.7 布尔类型bool
- 只有
true
和false
两个值。
2.8 数据的输入
- 使用
cin
从键盘获取数据。
第三部分:运算符
3.1 算术运算符
- 包括加
+
, 减-
, 乘*
, 除/
, 取模%
等。
3.2 赋值运算符
- 包括
=
,+=
,-=
,*=
,/=
,%=
等。
3.3 比较运算符
- 包括
==
,!=
,<
,>
,<=
,>=
等。
3.4 逻辑运算符
- 包括非
!
, 与&&
, 或||
等。
第四部分:程序流程结构
4.1 选择结构
if
语句:基于条件执行代码。switch
语句:多条件分支选择。
4.2 循环结构
while
循环:满足条件则循环。do...while
循环:至少执行一次循环。for
循环:计数器控制循环。
4.3 跳转语句
break
:跳出循环或switch
。continue
:跳过当前循环的剩余部分。goto
:无条件跳转到指定位置。
第五部分:数组
5.1 数组概述
数组允许我们将具有相同类型的多个数据项存储在一个单一的复合实体中。数组中的每个元素都可以通过索引访问,索引从0开始。
5.2 一维数组
5.2.1 定义一维数组
有三种方式可以定义一维数组:
int array1[5]; // 明确指定大小
int array2[5] = {1, 2, 3, 4, 5}; // 同时初始化
int array3[] = {1, 2, 3, 4, 5}; // 编译器根据初始化值数量确定大小
5.2.2 一维数组的内存模型
数组在内存中是连续存储的,这意味着整个数组的元素都存储在一个连续的内存块中。
5.3 二维数组
5.3.1 定义二维数组
二维数组可以看作是数组的数组,有四种定义方式:
int array1[3][2]; // 明确指定行和列
int array2[3][2] = {{1, 2}, {3, 4}, {5, 6}}; // 初始化
int array3[3][] = {{1, 2}, {3, 4}, {5, 6}}; // 编译器确定第二维大小
5.3.2 二维数组的内存模型
二维数组在内存中也是连续存储的,可以看作一个表或者矩阵。
第六部分:函数
6.1 函数概述
函数是执行特定任务的代码块,可以接收输入(参数)并产生输出(返回值)。
6.2 函数的定义
函数定义包括返回类型、函数名、参数列表、函数体和返回语句:
返回类型 函数名(参数类型 参数名, ...) {
// 函数体
return 返回值;
}
6.3 函数的调用
调用函数时,需要使用与函数定义匹配的参数:
函数名(实参1, 实参2, ...);
6.4 值传递
值传递意味着函数接收的是参数值的副本,函数内部对参数的修改不会影响到实参。
6.5 函数的常见样式
- 无参无返:既不接收参数也不返回值。
- 有参无返:接收参数但不返回值。
- 无参有返:不接收参数但返回值。
- 有参有返:既接收参数也返回值。
6.6 函数的声明
函数声明用于告知编译器函数的名称和如何调用,可以有多次声明,但只能有一次定义。
6.7 函数的分文件编写
将函数的声明放在头文件中,定义放在源文件中,有助于组织大型项目的代码。
第七部分:指针
7.1 指针概述
指针是一种变量,它存储了另一个变量的内存地址,通过指针可以间接访问和修改该变量的值。
7.2 指针变量的定义和使用
定义指针变量:
int *ptr; // ptr是一个指向int类型数据的指针
使用指针:
int var = 10;
ptr = &var; // 将ptr指向var的地址
int value = *ptr; // 通过ptr访问var的值
7.3 指针所占内存空间
在32位系统中,所有指针类型通常占用4个字节。
7.4 空指针和野指针
- 空指针:指针没有指向任何有效的内存地址,通常初始化为0。
- 野指针:指针指向了已经释放的内存或未分配的内存区域。
7.5 const修饰指针
- 常量指针:指针的值不可改变。
- 指针常量:指针指向的值不可改变。
- const修饰的指针常量:指针和指向的值都不可改变。
7.6 指针和数组
数组名可以作为指向数组首元素的指针使用,通过指针运算可以遍历数组。
7.7 指针和函数
指针可以作为函数参数传递,使得函数能够修改外部变量的值。
7.8 指针、数组、函数
结合使用指针、数组和函数可以实现复杂的算法,如冒泡排序。
第八部分:结构体
8.1 结构体概述
结构体(struct
)是C++中一种允许存储不同数据类型元素的复合数据类型。它使我们能够创建一个包含多个相关字段的单一实体。
8.2 结构体定义和使用
8.2.1 定义结构体
定义结构体的基本语法如下:
struct 结构体名称 {
数据类型 成员变量1;
数据类型 成员变量2;
// ...
};
8.2.2 创建结构体变量
有三种方式可以创建结构体变量:
struct 结构体名称 变量名; // 方式1: 先定义后创建
struct 结构体名称 变量名 = {值1, 值2}; // 方式2: 同时定义并初始化
struct 结构体名称 变量名; // 方式3: 在定义时创建
变量名 = {值1, 值2}; // 并初始化
8.2.3 访问结构体成员
使用点(.
)操作符来访问结构体变量的成员:
变量名.成员变量名;
8.3 结构体数组
结构体数组是将结构体变量存储在数组中,便于批量处理相同类型的对象。
8.3.1 定义结构体数组
struct 结构体名称 数组名[数组大小];
8.3.2 初始化结构体数组
struct 结构体名称 数组名[] = {
{成员1_1, 成员1_2},
{成员2_1, 成员2_2},
// ...
};
8.4 结构体指针
结构体指针用于访问和操作结构体变量。
8.4.1 定义结构体指针
struct 结构体名称 *指针名;
8.4.2 通过指针访问结构体成员
使用箭头(->
)操作符通过指针访问结构体成员:
指针名->成员变量名;
8.5 结构体嵌套结构体
一个结构体可以作为另一个结构体的成员,这种嵌套可以创建复杂的数据模型。
8.5.1 定义嵌套结构体
struct 外层结构体名称 {
struct 内层结构体名称 内层成员;
// ...
};
8.5.2 使用嵌套结构体
struct 外层结构体名称 变量名;
变量名.内层成员.成员变量名;
8.6 结构体做函数参数
结构体可以作为函数的参数传递给函数,可以按值传递或按地址传递。
8.6.1 按值传递结构体
void 函数名(struct 结构体名称 形参名) {
// 函数体
}
8.6.2 按地址传递结构体
void 函数名(struct 结构体名称* 指针形参名) {
// 函数体
}
8.7 结构体中const使用场景
const
关键字在结构体上下文中通常用于防止函数修改传入的结构体。
8.7.1 const结构体指针
const struct 结构体名称 *指针名;
8.7.2 const成员函数
cpp struct 结构体名称 { void 成员函数() const { // 常量成员函数,承诺不修改结构体任何成员 } };