c++备忘03
0x00 类
类型是对数据的表达和运算,即数据成员和函数成员,从面向对象的角度,类是接口,加上接口的实现,public即为接口,private为实现。
纯数据类用struct(其实和类一样,除了默认public),也可以定义函数,面向接口编程,而不是面向实现变成,先定义好接口,然后实现这个类。
类数据成员的三种初始化:
class C{
C(int a):A{a}{}
};
class C{
int A=a;
};
class C{
C(int a){
A=a;
}
}
}
初始化列表和声明处默认值等价,而构造函数类赋值就如同int a; a=2;是初始化后再赋值
成员函数 如果简单,直接在类里面定义,此时会成为内联函数,如果比较复杂,则单独在cpp里定义。(成员函数如果有参数默认值,只需在声明中,不能在定义中)
有两种枚举类enum class A{}; 和 enum B{}; 区别是前者遵从类的作用域,内部的枚举值都需要在A的作用域中才能使用,而B中的枚举值,作用域和B一样
不能对内置的类型运算符重载,对于[] =两个运算符,需要在类中声明
编译器默认提供浅拷贝和默认无参构造函数,但是如果定义了自己的构造函数,则不提供默认的
const成员函数,表示不会修改成员数据
对于类使用的辅助函数(与类的数据结构无关的函数),也可以放在类的cpp文件中
0x01 输入输出流
首先,c++的输入输出流不直接操作硬件,结构一般是,硬件-》驱动-》输入输出库-》程序,输入输出库抽象出输入流和输出流,
因此输入输出只需要 1创建恰当的数据源和数据目的的流 2对流进行读写
不论是输入输出库还是驱动都具有缓冲(udp没有)
io标准操作:1打开一个流 2检测是否打开 3操作 4关闭,一般流对象会在析构函数中自动关闭流,因此不显示关闭也可。
io错误处理:
输入有四种状态:good、eof、fail、bad。获取状态函数如下:
#include <iostream>
#include <fstream>
int main(){
string fileName="in.txt";
ifstream is{fileName};
while(true){
if(is.good()){
char ch;
is>>ch;
}else if(is.eof()){
error("no input\n");
}else if(is.fail()){
is.clear();//清除异常状态
//处理操作
}else if(is.bad()){
error("no input\n");
}
}
}
处于good时正常输入,eof到达文件末尾、bad硬件错误等不可恢复的错误、fail时输入类型错误等可恢复的,遇见eof和bad在输入函数中直接抛出error由需要输入的地方处理,遇见fail可以试试跳过不合法的输入类型。