C++ 类和对象,继承,派生

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();

静态数据成员为类属性,在定义类后、建立对象前就存在。因此,在建立对象前不能通过成员函数存取静态数据成员。C++提供了静态成员函数,用来存取类的静态成员。静态成员函数可以在类体内定义。也可以在类内声明为static,在类外定义。当在类外定义时,不能再使用static关键字作为前缀。通过类名调用静态成员函数。通过对象调用静态成员函数。

 

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  <继承方式>  <基类名>

 

 

虚函数

函数重载:是指两个或者多个函数具有相同的函数名,但这些函数的参数表必须不同:形参的个数、类型、次序至少有一个不同。可以在同一个类中实现构造函数和成员函数的重载,也可以在派生类中实现对基类中成员函数的重载。函数重载是在编译时确定调用哪个函数,是C++中静态多态性的体现。基类中使用关键字virtual定义了“虚函数”,则派生类中重新定义该函数时,无论是否使用关键字virtual,也都被看做是一个虚函数。若派生类中没有重新定义基类中的虚函数,则派生类继承基类的虚函数及其函数代码。构造函数不能是虚函数,但析构函数可以是虚函数。若某类中同时有虚函数和析构函数,则析构函数应说明为虚函数。

抽象类型和纯虚函数:

抽象类型不能用做函数参数类型、函数返回值类型或显式转换的类型。一般将抽象类中的析构函数定义为虚析构函数。抽象类的主要作用是提取若干类的共同行为,形成更清晰的概念层次。

   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。

纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。在派生类中必须完全实现基类的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象
   形式:virtual void funtion1()=0
 
 

运算符重载:函数成员操作符重载与友元函数操作符重载 参数个数差1.

函数类型  operator  运算符(形参表)

{

  // 函数体;

}

复合运算符的重载,我们在后面的练一练中学习。注意的是,复合运算符是双目运算符,一般重载为类的友元函数。 运算符“=”重载时只需要一个参数,所以一般重载为类的成员函数。

posted on 2012-02-08 17:50  Henry_Wang  阅读(676)  评论(0编辑  收藏  举报

导航