1,类的声明
class 类名
{
private:
....
protected:
....
public:
....
}; //结尾处的分号一定不能省略。
2,类成员的访问控制:public,protected、private。
3,成员函数:
a,类中定义的成员函数:放在类中定义的成员函数为内联函数。
b,类后定义的成员函数:内中声明函数原型,类外定义函数体格式。
返回值类型 类名::成员函数(形参表) {函数体}
4,对象的定义和引用
对象定义:Rectangle obj1,obj2;
对象的引用:obj1.getArea();
注意:C++编译器创建对象时,只为各对象分配用于保存各个对象数据成员初始化的值。并不为各个对象的成员函数分配单独的内存空间,而是共享类的成员函数的定义,即类中成员函数的定义为该类的所有对象所共享。
5,对象的赋值
同属于一个类的对象,所有数据成员诸位复制。彼此独立,都有自己的内存空间。
6,构造函数:对象建立时,自动调用:Student obj;默认构造函数
Student obj2(1.5f,2.0f);
Student obj3(obj2) 拷贝构造函数
没有返回值,必须声明定义为公有函数。系统会自动调用。对象成员构造函数的调用顺序取决于这些对象成员在类中的说明顺序,而与他们在成员初始化表的位置无关。如果没有定义构造函数,编译器会自动产生一个默认构造函数。
7,析构函数:对象生存期结束,或者使用delete释放由 new 来分配内存的对象,析构函数会自动调用。
8,对象指针和动态对象
对象指针 : class1 *p=new class1(1,2,4);
访问:p->age=21;p->output(); (*p).age=21;
用new运算符动态生辰的对象,在产生对象时调用构造函数,只用用delete释放对象时才调用析构函数,系统不能自动撤销动态生成的对象。
T *p=new T(); => delete T;
T *p=new T[N]; => delete [] T;
9,对象数组
初始化:class1 arr[3]={class1(),class1(),class1()};如果没有初始化表,则调用不带参数的构造函数。
10,this 指针!
默认说明: class1 *const this=&对象;
11,静态数据成员
用static 定义,必须:类内声明,类外初始化。可以为public private,protected.由于在类的定义中仅仅是对静态数据成员进行了引用性声明,因此必须在文件作用域的某个地方对静态数据成员进行定义并初始化,即应在类体外对静态数据成员进行初始化(静态数据成员的初始化与它的访问控制权限无关)。静态数据成员初始化时前面不加static关键字,以免与一般静态变量或对象混淆。
12,静态成员函数 :static void add() {s+=n;} 使用:class1::add();
13,友元函数
friend void translate(Score &s);
友元不是类的成员,但它可以访问类的任何成员(包括私有成员)。声明为友元的外界对象既可以是另一个类的成员函数,也可以是不属于任何类的一般的函数,称之为友元函数;友元也可以是整个的一个类,称之为友元类。友元函数和友元类统称为友元,友元的作用是提高程序的运行效率,但也牺牲了类的封装性。
二,基类和派生类
1,继承:<继承方式>可以有三种:公有继承方式public、保护继承方式protected及默认的私有继承方式private。<继承方式>默认时的继承方式是默认的private。
单继承:class classB:public classA {sentence;};
多继承:class classC:public class1,
public class2,...
{ sentences....;};
(1)公有继承(public)
派生类定义时通过关键字public指定公有的继承方式。 基类的公开成员还是公开的,包含的还是保护的。
(2)保护继承(protected)
在保护继承方式中,基类的公有成员和保护成员作为派生类的成员时,都成为派生类的保护成员,只能被此派生类的派生类或友元访问,而基类中的私有成员仍然是私有的。
(3)私有继承(private)
在私有继承方式中,基类的公有成员和保护成员作为派生类的成员时,它们都成为派生类的私有成员,只能被派生类的友元访问,不能再往下继承了,而基类中的私有成员仍然是私有的。
一般使用public 继承,基类的字段可以用protected.
继承方式主要是对子类的子类起作用。
1,派生类的构造函数:
<派生类构造函数名>(<派生类构造函数参数表>):<基类构造函数名>(<基类构造函数参数表>)
{
<派生类中数据成员初始化>
}
派生类不带参数的构造函数自动调用基类不带参数的构造函数。派生类带参数的构造函数若不指定调用基类带参数的构造函数,系统会自动调用基类不带参数的构造函数。
2,派生类的析构函数:
3,继承中构造函数和析构函数的调用顺序
构造函数:在程序中创建类对象时,会自动调用类的构造函数。继承中派生类和基类构造函数的调用顺序是:首先直接调用基类的构造函数,然后再调用派生类的构造函数。
4,虚基类和虚继承
虚基类:virtual <继承方式> <基类名>
虚函数
抽象类型和纯虚函数:
抽象类型不能用做函数参数类型、函数返回值类型或显式转换的类型。一般将抽象类中的析构函数定义为虚析构函数。抽象类的主要作用是提取若干类的共同行为,形成更清晰的概念层次。
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。
运算符重载:函数成员操作符重载与友元函数操作符重载 参数个数差1.
函数类型 operator 运算符(形参表)
{
// 函数体;
}
复合运算符的重载,我们在后面的练一练中学习。注意的是,复合运算符是双目运算符,一般重载为类的友元函数。 运算符“=”重载时只需要一个参数,所以一般重载为类的成员函数。