C++运算符重载、友元、继承、多态、文件操作

本文深入探讨了C++编程中的几个关键概念:运算符重载,包括加号、左移、递增等运算符的重载;友元机制,包括类和函数作为友元;继承的三种方式及访问权限;多态中的抽象类和纯虚函数应用;以及文件操作,涉及文本和二进制文件的读写。这些内容对于理解和提升C++编程技能至关重要。
摘要由CSDN通过智能技术生成

一、运算符重载

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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值