一、运算符重载
1.加号运算符
定义operator+()下面直接用+即可
2.左移运算符
ostream& operator<<(ostream& cout, zuoyi& z) 下面直接用
3.递增运算符
//前置++重载
dizeng& operator++()//返回引用是因为 一直对一个做操作
{
NUM++;
return *this;
}
//后置++重载
//后置返回的是值不是引用 因为 返回的是局部变量 返回值后 编译器清理
dizeng operator++(int)//占位符 区分前置后置
{
//先 记录结果
dizeng temp = *this;
//后 递增
NUM++;
//最后记录结果做返回
return temp;
}
4.赋值运算符
fuzhi& operator=(fuzhi& f) 下面直接用=
5.关系运算符
bool operator==(guanxi &g) 返回什么类型 具体看需求
6.函数调用运算符(仿函数)
int operator()(int a, int b)
void operator()(string test)
具体想实现什么看形参以及返回值 这东西很灵活 好用的很
二、友元
1.friend class GoodGay;//类做友元 写在别的类里面
能访问到 这个类里面的私有
2.friend void GoodGay(Building1* buliding);//goodgay全局函数是 building的好朋友 可以访问 私有成员
3.friend void GoodGay1::visit1();//成员函数做友元
三、继承
继承,减少重复代码,子类继承父类就是把所有的内容都继承但是 有些访问不到而已。
子类和父类中有同样的成员 eg:int a;要加作用域。总结 就是你没有的 你可以直接拿你爸的 你有了 还想拿就得说一声(加作用域)
父类有public protect private
子类继承方式有三种
1.公有继承
public protect 继承过来可以访问 都是以public protect继承过来 private不可访问
2.保护继承
public protect 继承过来以protect的形式继承过来的 private不可访问
3.私有继承
public protect 继承过来以private的形式继承过来的 private不可访问
继承中 先构造 父类 在构造子类 先析构子类 在析构父类
先有父亲后有儿子 儿子英年早逝 父亲白发人送黑发人
有多个爹的话 就要加作用域 但是 不建议用多继承
通过虚继承解决菱形继承的问题
class yang :virtual public animal {};
class tuo :virtual public animal {};
class yangtuo :public yang, public tuo {};
四、多态
class Basexu
{
public :
//只要有一个纯虚函数,这个类称为抽象类
//抽象类特显:
//1.无法实例化对象 不管是栈上 Basexu b; 还是在堆区上 new Basexu;都无法实例化对象 这样写都是错的
//2.抽象类的子类 必须要重写父类中的纯虚函数 否则也属于抽象类、
//写虚函数的意义就是让子类 重写父类 要不虚函数就没有任何意义
virtual void chunxu() = 0;
};
//父类指针在析构的时候 不U会调用子类中析构函数 导致子类如果有堆区属性 出现内存泄露
//什么时候用纯虚析构
//子类继承父类的时候 子类中有属性创建在堆区 因为 继承父类 实例化的时候使用父类实例化子类
//清理的时候清理的是父类的内容 这样会导致 类指针在析构的时候 不会调用子类中析构函数 导致子类如果有堆区属性 出现内存泄露
//解决这样的方法就是在父类中 把析构函数写成纯虚析构
//但是纯虚析构必须要类内声明 还有类外实现
//virtual ~animal() = 0;//类外声明
//animal::~animal(){...}//类外实现
五、文件操作
1.写文件:包含头文件#include <fstream>
//创建对象
ofstream ofs;
//指定打开方式
ofs.open("test.txt", ios::out);
//写内容
ofs << "张三" << endl;
ofs << "李四" << endl;
//关闭文件
ofs.close();
2.读文件:包含头文件#include<string>
//创建流对象
ifstream ifs;
//打开文件 并且判断是否打开
ifs.open("test.txt", ios::in);
if (!ifs.is_open())
{
cout << "打开失败" << endl;
return;
}
string buf;
//getline yaoyong string yinyong
while (getline(ifs, buf))//把文件流 放入buf中
{
cout << buf << endl;
}
//关闭文件
ifs.close();
3.二进制写文件
ofstream ofs;
ofs.open("erjinzhi.txt", ios::out | ios::binary);//二进制 后面的不一样 注意
//写文件
erjinzhixie e = { "张三",8 };//创建一个数据
ofs.write((const char*)&e, sizeof(erjinzhixie));//把这个数据地址 强转成(const char*) 地址就是&e &就是解一下 后面的参数就是多少字节
ofs.close();
4.二进制读文件
ifstream ifs;
ifs.open("erjinzhi.txt", ios::in | ios::binary);
if (!ifs.is_open())
{
cout << "打开失败" << endl;
}
erjinzhidu e;
//重点
ifs.read((char*)&e, sizeof(e));
cout << e.m_Name << e.m_age << endl;
ifs.close();