ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C++学习日记 Day11:重载/重写/重定义+C++文件操作

C++学习日记 Day11:重载/重写/重定义+C++文件操作 ## 今天学了什么今天学了C的重载/重写/重定义的区分、文件操作。## 重载/重写/重定义的区分注①重写和重定义简单区分步骤函数签名是否相同函数名参数列表 不相同 -重定义相同-看有没有virtual 有-重写 / 没有-重定义②静态绑定≠静态多态静态绑定编译阶段就确定调用哪个函数静态多态静态绑定多态行为同一函数名自动选择不同实现。③静态多态与动态多态区别静态多态编译期通过重载或模板选择函数动态多态运行期通过虚函数表选择函数//重载 class Fun { public: void func() { cout func()函数 endl; } void func(int a) { cout func(int a)函数 重载函数 endl; } }; //重写 class Base { public: virtual void name() { cout Base 的 name()函数 endl; } }; class Son :public Base { public: virtual void name() { cout Son 的 name()函数 endl; } }; //重定义(隐藏) //签名不一样 class Base2 { public: virtual void fuction(int) { cout Base2 的 fuction()函数 endl; } }; class Son2:public Base2{ public: void fuction() { cout Son2 的 fuction()函数 endl; } }; //签名一样 没有virtual class Base3 { public: void fuction() { cout Base3 的 fuction()函数 endl; } }; class Son3 :public Base3 { public: void fuction() { cout Son3 的 fuction()函数 endl; } }; void test() { //重定义 Son3 s3; s3.fuction(); s3.Base3::fuction(); // 重载 调用不同类型 看编译器匹配哪个版本 Fun f; f.func(); f.func(10); //利用父类指针验证 重写 观察进入哪个函数 检验virtual是否生效 Base* bas new Son(); bas-name(); delete bas; }## 文件操作* 头文件fstream* 操作文件的三大类ofstream写操作ifstream读操作fstream 读写操作* 文件类型分为两种文本文件、二进制文件。* 文件打开方式打开方式说明ios::out写文件打开ios::in读文件打开ios::ate初始位置文件尾ios::app追加方式打开ios::trunc如果文件存在先删除再创建ios::binary二进制方式打开### 文本文件的读写操作写文件步骤添加头文件 #includefstream创建流对象 ofstream ofs打开文件 ofs.open“文件路径”打开方式写数据 ofs“写入的内容”关闭文件 ofs.close读文件步骤添加头文件 #includefstream创建流对象 ifstream ifs打开文件 ifs.open“文件路径”打开方式判断文件是否打开成功 ififs.is_open()打开成功读数据四种方式①char info[1000]{0};while(ifsinfo) coutinfoendl;②char info[1000]{0};while(ifs.getline(info,sizeof(info))) coutinfoendl;③string s;while(getline(ifs,s)) coutsendl;④char c;while((cifs.get())!EOF) coutc;关闭文件 ofs.close### 二进制文件的读写操作写ofs.write((const char*) p, sizeof(Person));读ifs.read((char*) p, sizeof(Person));示例#includeiostream using namespace std; #includefstream class Person { public: char name[64];//建议不用string int age; }; void test() { //读文件 Person p; ifstream ifs; ifs.open(twomode.txt, ios::in | ios::binary); if (!ifs.is_open()) { cout 文件打开失败 endl; return; } ifs.read((char*)p, sizeof(Person)); int read_len ifs.gcount();//监测读入几个字节 bool read_ok ifs.good();//是否读成功 cout 姓名 p.name 年龄 p.age endl; ifs.close(); } int main() { //写文件 //ofstream ofs; //ofs.open(twomode.txt, ios::out | ios::binary); //Person p { 张三,10 };//聚合类的聚合初始化 //ofs.write((const char*) p, sizeof(Person)); // //ofs.close(); test(); return 0; }在ifs.read出下断点进入调试观测局部变量 read_len 的值为68发现与之前写入文件的字节数一致644int,观测 read_ok 的值为true数据读取成功。 gount() 返回上一次读取字节数good() 表示流状态正常## 补充** 聚合初始化 **聚合类条件没有自定义构造函数没有protected/private成员只有public成员没有虚函数没有虚继承满足以上条件的类称为聚合类聚合类可以用{}按申明顺序给成员赋值。class Person{public: void func(){…}string name;int age;}赋值: Person p{“张三”18}* 注①聚合类可以有成员函数②聚合初始化只作用于非静态成员变量成员函数、static静态成员不在{}初始化列表里
返回列表