您的位置:首页 > 科技 > IT业 > 工业设计专业就业方向_楼网络规划设计方案_永久免费的电销外呼系统_百度旅游官网

工业设计专业就业方向_楼网络规划设计方案_永久免费的电销外呼系统_百度旅游官网

2025/1/9 16:01:22 来源:https://blog.csdn.net/wjm041006/article/details/144893225  浏览:    关键词:工业设计专业就业方向_楼网络规划设计方案_永久免费的电销外呼系统_百度旅游官网
工业设计专业就业方向_楼网络规划设计方案_永久免费的电销外呼系统_百度旅游官网

文件

C++对文件操作需要包含头文件<fstream>

文件类型分为两种:

  • 文本文件
  • 二进制文件

操作文件三大类

  • ofstream:写操作
  • ifstream:读操作
  • fstream:读写操作

写操作

  1. 包含头文件:#include <fstream>
  2. 创建流对象 ofstream ofs;
  3. 打开文件 ofs.open("文件路径",打开方式);
  4. ofs<<"写入的数据";向文件中写数据
  5. ofs.close;关闭文件

note:文件打开方式可以配合使用,利用 | 操作符 

如:ios::binary | ios::out

读文件

  1. 包含头文件:#include <fstream>
  2. 创建流对象 ifstream ifs;
  3. 打开文件 ifs.open("文件路径",打开方式);
  4. 四种方式进行读取数据
  5. ifs.close;关闭文件

判断文件是否打开成功的代码

if (!ifs.is_open())
{cout<<"文件打开失败"<<endl;return;
}

四种读取方式

char buf[1024] = {0};
while(ifs>>buf)//如果ifs读到文件尾会返回false
{cout<<buf<<endl;}
char buf[1024] = {0};
while( ifs.getline(buf , size(buf)) );//按照行读取数据,前面为数组名,后面为准备空间的大小
{cout<<buf<<endl;
}
string buf;
//note:需要包含string头文件
while(getline(ifs,buf))
{cout<<buf<<endl;
}
char c;
while( (c = ifs.get()) != EOF )//end of file EOF
{cout<<c;
}

二进制读写文件

以二进制方式对文件进行读写操作,打开方式要指定为ios::binary

二进制方式写文件重要利用流对象调用成员函数write

函数原型为:ostream & write(const char * buffer,int len);//如果返回值类型不是char,需要通过强制转换为(const char *)

buffer指向内存空间为其地址,len代表长度

读文件

函数原型为:istream & read(char * buffer,int len);

buffer指向内存空间为其地址,表示读到哪里,len代表长度

模板

模板就是通用的模具,大大提高复用性

C++中模板分为两种:分别为函数模板和类模板

函数模板

建立一个通用函数,其函数返回值和形参类型可以不具体制定,而是用一个虚拟的类型来代表

语法

template <typename T>
函数声明或者定义

template 声明创建模板

typename 表面其后面的符号为一种数据类型,可以用class代替

T 通用数据类型,名称可以替换

在声明模板后,有两种数据类型传入方式

1.隐式
mySwap(a,b);
2.显式
mySwap<int>(a,b);

函数模板注意事项

隐式类型推导:必须推导出一致的数据类型才可以使用,就是参数T必须保持一致

模板必须要确定出T的类型,才可以使用,就算函数没参数,你也要指定T的数据类型

函数模板于普通函数的区别

普通函数调用可以发生隐式类型转换,函数模板隐式类型推导不可以发生隐式类型转换,而用显示指定类型,可以发生隐式类型转换

普通函数和函数模板的调用规则

  • 如果普通函数和函数模板重名,优先调用普通函数
  • 可以通过空模板参数列表来强制调用函数模板 如:mySwap<>(a,b);
  • 函数模板可以发生重载
  • 如果函数模板可以产生更好的匹配,优先调用函数模板

有些特定数据类型,需要用具体化方式做特殊实现

如果定义了一个Person的类
template<> bool compare(Person &a,Person& b)
{代码
}

类模板

建立一个通用类,类中的成员可以不具体制定,用一个虚拟的类型来代表

语法

template<class T>
类
如果要写多个数据类型,下面是一个示例
template<class NameType,class AgeType>
class Person
{
public:Person(NameType name,AgeType age){this -> m_Name = name;this -> m_Age = age;}NameType m_Name;AgeType m_Age;
};

note:

  • 类模板没有自动类型推导的使用方式
  • 类模板在函数参数列表中可以有默认参数
template<class NameType,class AgeType = int>

类模板中成员函数创建时机

  • 普通类的成员函数一开始就创建
  • 类模板中的成员函数在调用时才创建

类模板对象做函数参数

三种传入方式

  • 指定传入的类型 -- 直接显示对象的数据类型
  • 参数模板化 -- 将对象中的参数变为模板进行传递
  • 整个类模板化 -- 将这个对象类型模板化进行传递
template<class T1,class T2>
class Person
{
public:Person(T1 name,T2 age){this -> m_Name = name;this -> m_Age = age;}void showPerson(){cout<<"姓名:"<<this->m_Name<<"年龄:"<<this->m_Age <<endl;}T1 m_Name;T2 m_Age;
};指定传入类型
void printPerson1(Person<string,int>&p)
{p.showPerson();
}参数模板化
template<class T1,class T2>
void printPerson2(Person<T1,T2>&p)
{p.showPerson();
}整个类模板化
template<class T>
void printPerson3(T &p)
{p.showPerson();
}Person<string,int>p("孙悟空",100);
printPerson1(p);
printPerson2(p);
printPerson3(p);

类模板和继承

  • 当子类继承的父类是一个类模板的时候,子类在声明的时候,要指定出父类中的类型
  • 如果不指定,编译器无法给子类分配内存
  • 如果想灵活指定父类中T的类型,子类也许变为类模板
指定参数
class son : public Base<int>
{};子类变为类模板
template<class T1,class T2>//T2为父类的数据类型
class son2: public Base<T2>
{T1 obj;
};

类模板成员函数类外实现

template<class T1,class T2>
类名<T1,T2>::函数名(T1 变量名,T2 变量名)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com