从C到C++
新类型 bool类型
新的输入输出方式 con cout
新的内存存储方式 new delete
引用& 用于传参
函数 内敛函数inline 通过代码区膨胀 减少函数的跳转时间 用来代替c语言的宏定义 放在函数的前面
重载 函数名相同参数不一样 参数类型相同 参数个数不一样 在编译的时候相同函数名存储的形式不一
缺省 定义的时候 给参数赋默认值 调用函数 可以不用给缺省的参数赋值 缺省条件从右向左
命名空间
using namespace std;
防止函数冲突
命名空间的三种方法
using namespace std; 最不安全 最简单 可以直接调用命名空间std里面的函数cin>>x;
std::cin>>x;最安全最麻烦 每次调用函数 都需写命名空间std
using std::cin; cin>>x见于上面两个之间 调用什么就在using 命名空间里写什么
域名解析符::
类和对象
结构体 成员变量 点运算符 箭头运算符
类 成员函数 在类中定义 使用this来访问成员 必须用对象调用或者对象指针调用
成员函数在类外定义 需要函数名前面加上类名 使用域名解析符进行定义
访问权限 共有public 可以在外部访问 私有private 受保护 protected 不能在外部访问
类是私有的结构体 结构体是公有的类
构造析构
函数名和类名相同就是构造 可以有多个 可以重载 可以缺省 根据对象的参数来调用哪一个构造
在类名和函数名前没加~代表析构 只有一个 没参数
构造和析构都没有返回值 在一个类的定义的时候 编译器会自动加上构造和析构
const修饰成员 const修饰成员变量 必须初始化形参列表赋值
const修饰成员函数 函数后面加航const 防止使用this执政来修改成员的值
拷贝构造
拷贝构造是一种特殊的构造
对象在定义的时候 可以调用拷贝构造 也可以调用其他构造 如果参数是同类型的对象 那么调用拷贝构造 拷贝构造的 形参必须使用引用(规定)
参数是对同一类型对象的引用
拷贝的两种方案 深拷贝和浅拷贝
深拷贝每个指针单独指向一块内存 对于对内存 每次开辟新的内存 存放内容 不让两个指针指向同一块区域
static修饰的成员 变量不属于某个对象 属于全部的对象 整个类和这个给类的所有对象 全部共享一份static变量 必须在类外初始化
static修饰成员函数 成员函数前没加上static 里面没有this指针无法访问普通成员
运算符重载
友元 friend 可以访问对象的私有成员 不属于类 因此没有this指针
可以访问该类对象的成员 包括私有
重载运算符操作数是几个 就有几个参数
friend返回值类型 operator运算符(参数a,参数b)
运算符重载 想要使用什么运算符 就堆什么运算符进行重载
operator+运算符 函数名 重载方式
成员函数的调用方式 双目运算符 只需要一个额外的参数 另外一个参数是this
A A::operator+(const A&b); 引用提高效率 const防止修改
继承
继承是在原有类的基础上 创造一个新的类 子类会继承父类所有的成员变量 父类有的子类都有
原有类称为父类或者基类 新类称为子类或者派生类父类派生子类 子类继承父类
权限控制 继承之后堆一些访问权限做了修改 父类的私有成员在子类中不可访问
子类在父类的基础上加了新的成员
子类可以定义与父类同名的变量或者函数 父类得到隐藏 优先调用子类的新成员
父类的构造和析构不能用于子类 子类需要的时候需要重写父类的构造和析构 所有子类的构造和析构都要调用父类的构造
子类先调用父类的构造 然后再调用子类的构造 子类先调用自己的析构然后再调用父类的析构
多态
一种形式多种状态
实现方式 虚函数 父类指针/引用可以指向子类对象 优先调用父类函数
子类重写父类函数 用父类指针可以调用子类重写的函数
动态联编 调用的时候才知道调用那个函数 使用函数指针根据指针找到函数 比较灵活速度不快
静态联编 再运行前就知道调用什么函数 速度比较快但 不灵活
虚表 拥有虚函数的对象中会有虚表指针 这个指针指向虚函数表(表中存放虚函数地址)
子类重写父类虚函数是区修改虚表中的地址
文件操作
文件分为二进制文件和文本文件
文本文件:txt cpp直接能打开的文件 字符流
二进制文件 需要特定的软件才能打开 字节流
c语言通过文件执政来操作 FILE *fp 所有的操作围绕文件指针来进行
文件流 ifstream 只写文件 ofstream 只读文件
fstream 打开关闭open close is_open 读写文件 get/put read/write getline 输入输出运算符
操作seekp 移动文件的位置 tellp 得到文件指针的偏移量
异常处理
计算的时候 遇到除法 除数是0的情况 文件打开失败 申请对内存的时候失败
运行的时候遇到非代码错误的问题 遇到之后 提交给调用方处理
处理方式 try 测试代码 catch 捕获异常 throw 抛出异常
处理不了给上级 如果最终无人处理或者处理不了 结束程序
C11标准
变量初始化 int a=0,a(0),a{0};
nullptr 相当于c中的NULL 有变量的类型更加的安全
auto 自适应类型 自动类型 根据你赋的值来确定变量的类型
decltype 一个括号时用一个变量定义同类型的变量 两个括号时该类型的引用
关于for的一个用法 for(auto i:arr);遍历arr数组中所有的元素
类型别名 C语言typedef typedef int INT typedef 类型 别名
C++ using 别名=类型名
类中成员 一般是在构造中赋值 C11可以直接在类中赋值
A()=default;自动生成默认构造
委托 在构造中调用自己的其他构造
final 终极类或者终极函数 不能使用虚函数 不能派生子类
模板
template<class T> 写和类型无关的代码 调用的时候传入类型
函数模板 函数(参数) 隐性调用 通过参数确定T类型
函数<类型>(参数) 显示调用 直接传入T的类型
类模板 类名<类型> 对象名