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可以试试跳过不合法的输入类型。