Files
logseq/pages/黑马C++课程.md

281 lines
7.7 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
- C++基础
- 打印hello world
- sh: 1: pause: not found
linux下出现这个因为linux无法识别system("pause")
- ```c++
#include <iostream>
// linux need this to use pause
#include <unistd.h>
using namespace std;
// main is the enter of program and only have one
int main()
{
cout << "hello world" << endl;
// console pause
pause();
// linux can not use this
// system("pause");
return 0;
}
```
- 注释
- 使用//进行单行注释
- 使用/* xxxx */进行多行注释
- 定义变量
- 数据类型 变量名 = 初始值;
- 定义常量
- \#include 常量名 常量值
- const 数据类型 变量名 = 初始值;
- 关键字
- int
- sizeof
- 统计数据类型所占用内存大小
- ……
- 标识符命名规则
- 不能是关键字
- 只能由字母,数字,下划线组成
- 第一个字符必须为字母或下划线
- 标识符字母区分大小写
- 数据类型
- 整型
- short
- int
- long
- long long
- 实型(浮点型)
- 默认情况下输出小数会显示6位小数
- float
- double
- 字符型
- char
- 转义字符
- \\n
- \\r
- \\\\
- \\t
- 字符串型
- C 风格
- char str[] = "hello world"
- C++风格
- \#include <string>
- string str = "hello world"
- 布尔类型
- true
- false
- 数据输入
- cin >> 变量
- 运算符
- 算术
- 赋值
- =
- +=
- -=
- *=
- /=
- %=
- 比较
- ==
- =
- <
- >
- <=
- \>=
- 逻辑
- !
- &&
- \|\|
- 流程结构
- 选择结构
- if
- 三目运算符
- 表达式1 表达式2 表达式3
- switch语句
- 循环结构
- while
- do while
- for
- 跳转语句
- break
- continue
- goto
- 无条件跳转语句
- goto 标记执行goto时会跳转到标记的位置
- 标记使用`FLAG:`来表示
- return
- 数组
- 每个元素都是相同数据类型
- 由连续内存位置组成
- 数据类型 数组名[数组长度];
id:: 651fcf37-7dfb-4db4-9a8d-12dbf5ab7d41
- 数据类型 数组名[数组长度] = {值1,值2,值3……}
- 数据类型 数组名[] = {值1,值2,值3……};
- 查看元素地址
- cout << (int) &arr[0] << endl;
- 二维数组
- 函数
- 返回值类型 函数名 (参数列表)
{
函数体语句
return表达式
}
- 值传递
- 函数的形参发生改变,并不会影响实参
- 样式
- 无参无返
- 无参有返
- 有参无返
- 有参有返
- 声明
- 函数的声明可以有多次,但是定义只能有一次
- 声明可以提前告诉编译器函数的存在
- 分文件编写
- 创建后缀名为.h的头文件
- \#include <iostream>
- using namespace std;
- 创建后缀名为.cpp的源文件
- \#include "swap.h"
- 在头文件中写函数的声明
- 在源文件中写函数的定义
- 指针
- 通过指针间接访问内存
- 数据类型 * 指针变量名;
- p = &a;
- 解引用
- 通过指针前加*可以找到指针指向内存中的数据
- 32位系统4个字节64位系统8个字节
- 空指针
- 指针变量指向内存变量中编号为0的空间
- 用于初始化指针变量
- int * p = NULL;
- 空指针指向的内存是不可以访问的
- 野指针
- 指向非法的内存空间
- int * p = (int *)0x1100;
- const修饰
- 常量指针
- const int * p = &a;
- 指针的指向可以修改,但是指向的值不可以修改
- 指针常量
- int * const p = &a;
- 指针的指向不可以修改,但是指向的值可以修改
- 即修饰指针,又修饰常量
- const int * const p = &a;
- 指针的指向和指向的值都不可以修改
- 指针和数组
- int * p = arr
- p++可以指向下一个元素
- 作为函数参数时,可以修改实参的值
- swap(int *p1, int *p2){}
- swap(&a, &b);
- 结构体
- 用户自定义的数据类型,允许用户存储不同的数据类型
- struct 结构体名 { 结构体成员列表 };
- 结构体数组
- struct 结构体名 数组名[元素个数] = {{},{},{}……}
- 结构体指针
- 利用 -> 可以通过结构体指针访问结构体属性
- student * p = &s;
- p->name
- 作为函数参数
- 值传递
- 地址传递
- 改为指针可以减少内存空间,且不会复制新的副本
- 使用const防止误操作
- 加入const有修改的操作就会报错
- void printStudent(const student *s){}
- 通讯录管理系统
- C++核心编程,面向对象编程
- 内存分区模型
- 代码区:存放函数体的二进制代码,由操作系统管理
- 全局区:存放全局变量和静态变量及常量
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
- 不同的区域存放的数据,赋予不同的生命周期,给我们更大的编程灵活性
- 运行前
- 编译后生成exe未执行前分为两个区域
- 代码区:
- 存放CPU机器指令
- 共享的,对于频繁执行的程序,内存中只需要有一份代码
- 只读的,防止其他程序修改
- 全局区
- 全局变量和静态变量
- 包含常量区,存放字符串常量和其他常量
- 该区域数据程序结束后由操作系统释放
- 运行后
- 栈区
- 存放函数参数值,局部变量等
- 不要返回局部变量的地址,栈区的地址由操作系统开辟和释放
- 堆区
- 由程序员分配手动释放利用操作符delete
- delete a
- delete[] arr
- 主要利用new在堆区开辟内存
- new 数据类型,创建后会返回该数据对应的数据指针
- 引用
- 本质是一个指针常量
- 数据类型 &别名 = 原名
- 引用必须初始化
- 引用在初始化后,不可以改变
- 用作函数参数
- 可以让形参修饰实参
- 可以简化指针修改实参
- 作为函数返回值
- 不要返回局部变量的引用
- 函数的调用可以作为左值
- 常量引用
- 修饰形参数,防止误操作
- 函数默认参数
- 返回值类型 函数名 (参数 = 默认值) {}
- 如果某个位置已经有了默认参数,那么从这位置开始后面的都要有
- 函数声明有默认参数,函数实现就不能有默认参数,声明和实现只能有一个默认参数
- 函数占位参数
- 返回值类型 函数名 (数据类型){}
- 占位参数也可以有默认参数
- 函数重载
- 函数名相同,参数不同
- 引用作为重载条件
- 函数重载碰到函数默认参数
- 类和对象
- 封装
- class 类名 { 访问权限: 属性/行为 };
- public
- protected
- private
- 和struct的区别
- struct默认权限为公共
- class默认权限为私有
- 成员属性私有化
- 可以控制读写权限
- 可以检测数据有效性
- 继承
- 多态
- 初始化和清理
- 构造函数
- 类名(){}
- 可以重载
- 有参构造和无参构造
- 普通构造和拷贝构造
- Person(const Person &p){}
- 调用方法
- 括号法
- Person p1;
- Person p2(10);
- Person p3(p2);
- 显示法
- Person p1;
- Person p2 = Person(10);
- 隐式转换法
- Person p2 = 10;
- Person p2 = p2;
- 析构函数
- ~类名(){}
- 没有参数,不能重载
-
- 职工管理系统
- C++提高编程
- 泛型编程STL
- 演讲比系统
- 机房预约系统