launch.json "program": "${fileDirname}/${fileBasenameNoExtension}" ,
#include
这是一个预处理命令,在调用编译器运行时,该指令使得预处理器将include后面的<>中的文件读入程序,如同将这个文件输入到源代码中的这个位置
#define是一个预处理器宏,预处理器将进行文本替换,而不是智能替换
#include <cstdint> 使用整型数据
#include<cmatch> 使用常量和常量表达式
#include<iostream>
using namespace std; 使用#include<iostream>时,要有using namespace std;
#include<vector> 使用动态数组
#include<string> 使用字符串
#include<bitset> 使用二进制数
#define编写宏函数
assert 验证表达式(也常做函数使用)
常量:const const double pi=22.0/7
常量表达式:constexpr constexpr double Getpi() {return 22.0/7}
:: 域解析运算符,作用域运算符(表明归属性)
逻辑运算符NOT(!) AND(&&) OR(||)
按位运算符NOT(~) AND(&) OR(|) XOR(^)
移位运算符 >> << 不会旋转,左移后右边补零
enum枚举
Public 类属性和声明为公有的,有了对象就可以获取
Private 声明为私有的,只能在类的内部或其友元中访问
二分模板:
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1,计算mid时不需要加1,即mid = (l + r)/2。
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid,此时为了防止死循环,计算mid时需要加1,即mid = ( l + r + 1 ) /2。
*使用时根据代码进行判断,看令L=mid OR mid+1,L=mid+1,则mid=(l+r)/2.
程序=数据结构+算法
数据结构:对数据的存储方式(指数据类型)
算法:对存储好的数据进行分析的步骤,操作数据的步骤=功能函数
c++的三大特性:
1.封装:把客观的事物封装成抽象的类(将数据和方法打包在一起,加以权限的区分,达到保护并安全使用数据的目的)
意义:将属性和行为作为一个整体表现生活中的事物;将属性和行为加以权限控制
Struct和class的区别在于默认的访问权限不同:struct默认公共,class默认私有
Class类中的属性和行为统称为成员:
属性/成员属性/成员变量 行为/成员函数/成员方法
成员变量和成员函数分开储存,非静态成员变量属于类的对象上,静态成员变量、非静态成员函数、静态成员函数不属于类的对象上
访问权限:
公共权限 public 成员 类内可以访问,类外可以访问
保护权限 protect 成员 类内可以访问,类外不可以访问
私有权限 private 成员 类内可以访问,类外不可以访问
友元friend,可访问类的私有属性,实现方法:
- 全局函数做友元 将全局函数加关键字friend放在类下面表示声明即可使用
- 类做友元 将一个类的名称加关键字friend放在另一个类下面表声明
- 成员函数做友元 将一个成员函数用类外表达的方式在一个类中加关键字friend
- 继承:表达的是类之间相关的关系,使得对象可以继承另一类对象的特征和能力(避免公用的代码重复开发,减少代码和数据冗余)
Class 子类 : 继承方式 父类 (子类/派生类;父类/基类)
继承方式有:公共继承(继承后公共的仍为公共的);保护继承(继承后公共的变为保护的);私有继承(继承后公共和保护的都变为私有的)—任何方式都不能访问私有的,只是不能访问,被继承下去了,会占有内存
访问子类同名成员,直接访问即可;访问父类同名成员,需要加作用域;当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
菱形继承(钻石继承):
两个派生类继承同一个基类;又有某个类同时继承这两个派生类——在继承之前加上关键字virtual变为虚继承,此时的基类为虚基类,vbptr:虚基类指针,会指向一个虚基类表格vbtable
- 多态:“一个接口,多种方法”
在不同继承关系的类对象,去调同一函数,产生了不同的行为
静态多态和动态多态:
静态多态函数地址早绑定—编译阶段确定函数地址
动态多态函数地址晚绑定—运行阶段确定函数地址
动态多态满足条件:(1)有继承关系(2)子类重写父类的虚函数