2021-01-15 - 2021-01-17

继承
继承方式
不同的继承方式决定了派生类从父类继承成员的访问权限上限。
如public继承的话,访问权限最高,所以基类成员的访问修饰不变。private继承的话从基类继承的成员都变成了private,这样继续派生的派生类就无法访问间接基类的成员了。

派生类构造顺序

  • 构造基类,基类顺序按照继承时基类的顺序
  • 声明类对象的顺序
    所以,构造顺序与构造函数怎么写无关

派生类复制构造函数
因为类型兼容,所以可以将派生类的引用直接传给基类的复制构造函数。

虚基类
class B2:virtual public B1
解决多继承时基类有共同基类的问题
虚基类的构造函数由最远派生类调用

重载运算符

class Point2D
{
public:
    const int& X;
    const int& Y;
    Point2D():x(0),y(0),X(x),Y(y) {};
    Point2D(int _x,int _y) :x(_x), y(_y), X(x), Y(y) {};
    Point2D operator + (const Point2D& _after)
    {
        return Point2D(X + _after.X, Y + _after.Y);
    }

        friend Point2D operator +(const Point2D& p1, const Point2D& p2);

    Point2D operator - (const Point2D& _after)
    {
        return Point2D(X - _after.X, Y - _after.Y);
    }

    Point2D& operator ++()
    {
        x++;
        y++;
        return *this;
    }

    Point2D operator ++(int)
    {
        Point2D old = *this;
        ++* this;
        return old;
    }
private:
    int x;
    int y;
};

Point2D operator +(const Point2D& p1, const Point2D& p2)
{
    return p1 + p2;
}
  • 前置自增(),后置自增(int)
  • 前置返回引用,后置返回自增前的复制(因为复制是局部的,所以不能引用)
  • 函数内重载只能point1+变量,不能变量+point1,这是可以用函数外重载,注意声明时要加friend

虚函数
在编译过程中不确定指向哪个函数,运行时再确定
写在类内的函数是内联函数,编译时就会把它嵌入到类内部,它是静态的。所以为了动态调用派生类的方法,需要写在函数外面

虚表


image.png

对象指向虚表,虚表指向函数

纯虚函数
基类的函数因过于抽象而无法实现,所以没有函数体,virtual func()=0
只要类里面有一个是纯虚函数,就无法实例化,它是抽象类

override
派生类实现基类的虚函数时,编译器根据函数名、参数等确定该函数是虚函数还是普通函数。所以重写虚函数时写错了也会被当普通函数,而不会报错,难以发现问题。
使用override可以显式覆盖,若基类没有相同虚函数时会报错

输入/输出
宽度:

  • cout.width(10);
  • cout< 对齐方式
    cout< 取消对齐
    cout< setiosflags
    setiosflags中有许多参数,可以控制输出的格式
    设置精度
    cout< cout< fixed与scientific
    fixed是正常的数字,scientific是科学计数法

二进制保存数据
ofstream file("filename",ios::binary);
file.write((char*)value,sizeof(value));
file.close();

  • binary
  • write(char* start,int length);

你可能感兴趣的:(2021-01-15 - 2021-01-17)