抽象的作用是表示一类事物的本质。
类是对象的抽象,而对象则是类的特例,或者说是类的具体表现
多态性是指:由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。
面向过程:
程序 = 算法 + 数据结构
面向对象:
对象 = 算法 + 数据结构
程序 = 对象s + 消息
消息的作用就是对对象的控制。
类的公用接口与私有实现的分离形成了信息隐蔽。
如"stud.display()"就是一个发给对象的消息。
参数初始化表:
Box (int h, int w, int len) : height(h), width(w), length(len) { }
如果数据成员是数组,则应当在构造函数的函数体中用语句对其赋值,而不是在参数初始化表中对其初始化。如
Student(int n, char s, nam[]):num(n), sex(s) { strcpy(name, nam); }
默认构造函数是可以无实参调用的构造函数。
默认参数可以省略形参名,如
Box (int = 10, int = 10, int = 10);
静态数据成员(static)只占一份空间,在编译期分配内存。可以在类外初始化,如
int Box::height = 10;
但不能用参数初始化表对静态成员初始化。
静态数据成员如果是公开的,可以直接通过类名引用。
成员函数也可以定义为静态的,如
static int volume();
静态成员函数不能访问本类中的非静态成员。
不能重载的运算符有5个:
. * :: sizeof ?:
重载不能改变运算符运算对象的个数,也不能有默认的参数。
重载的运算符必须和用户自定义类型的对象一起使用。
示例:
Complex operator + (Complex c1, Complex c2) {
return (Complex)(c1.real+c2.real, c1.imag + c2.imag) }
也可以在Complex类内重载:
Complex operator + (Complex c2) {
return (Complex)(c.real+c2.real, c.imag + c2.imag) }
赋值运算符=、下标运算符[]、函数调用运算符()、成员运算符->必须作为成员函数。
流插入和流提取运算符、类型转换运算符不能定义为成员函数。
在Cpp中,以下两种类型转换方式都可以使用:
int(9.9);
(int)9.9;
前一种写法是“类型转换函数”,可以进行重载。
声明派生类的一般形式为:
class 派生类名:继承方式 基类名
{
派生类成员声明
};
继承方式有三种:public、protected、private。
不论采取何种方式,都无法访问基类的private成员。采用public方式时,成员访问属性不变,采用private方式时,基类成员在派生类中变为private成员,采用protected方式时,基类成员在派生类中变为protected成员。
派生类构造函数声明:
Student1(int n, string nam, char s, int a, string ad):Student(n, nam, s){
age = a;
addr = ad;
}
或:
Student1(int n, string nam, char s, int a, string ad):Student(n, nam, s), age(a), addr(ad){}
声明多重继承的方法
class D: public A, private B, protected C
多重继承派生类的构造函数:
Graduate(string name, int a, char s, string t, float sco, float w): Teacher(nam, a, t), Student(nam, s, sco), wage(w) {}
虚基类方法:
class A {
...
};
class B: virtual public A { // A是B的虚基类
...
};
class C: virtual public A {
...
};
虚基类的初始化由派生类完成。
多态性分为静态多态性和动态多态性。静态多态性是通过重载实现的,而动态多态性是通过虚函数实现的。
虚函数的声明形式为:
virtual 函数类型 函数名(形参表);
纯虚函数的声明形式为:
virtual 函数类型 函数名(形参表) = 0;
setiosflags(n): 设置小数为n位。 例:
cout << setiosflags(ios::fixed) << setprecision(2) << 123.456 << endl;