继承
继承方式
不同的继承方式决定了派生类从父类继承成员的访问权限上限。
如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
虚函数
在编译过程中不确定指向哪个函数,运行时再确定
写在类内的函数是内联函数,编译时就会把它嵌入到类内部,它是静态的。所以为了动态调用派生类的方法,需要写在函数外面
虚表
对象指向虚表,虚表指向函数
纯虚函数
基类的函数因过于抽象而无法实现,所以没有函数体,virtual func()=0
只要类里面有一个是纯虚函数,就无法实例化,它是抽象类
override
派生类实现基类的虚函数时,编译器根据函数名、参数等确定该函数是虚函数还是普通函数。所以重写虚函数时写错了也会被当普通函数,而不会报错,难以发现问题。
使用override可以显式覆盖,若基类没有相同虚函数时会报错
输入/输出
宽度:
- cout.width(10);
- cout<<setw(10)<<value;
对齐方式
cout<<setiosflags(ios_base::left)<<setw(10)<<value;
取消对齐
cout<<resetiosflags(ios_base::left);
setiosflags
setiosflags中有许多参数,可以控制输出的格式
设置精度
cout<<setiosflags(ios_base::fixed)<<setprecision(2);//保留小数点后面的2位有效数字(fixed或scientific)
cout<<setprecision(2);//保留2位有效数字
fixed与scientific
fixed是正常的数字,scientific是科学计数法
二进制保存数据
ofstream file("filename",ios::binary);
file.write((char*)value,sizeof(value));
file.close();
- binary
- write(char* start,int length);