c++对象的基础知识

面向过程的设计方法

• 重点:
–如何实现的细节和过程,将数据与函数分开。
• 形式:
–主模块+若干个子模块(main()+子函数)。
• 特点:
–自顶向下,逐步求精——功能分解。
• 缺点:
–效率低,程序的可重用性差。

面向对象的方法

• 目的:
–实现软件设计的产业化。
• 观点:
–自然界是由实体(对象)所组成。
• 程序设计方法:
–使用面向对象的观点来描述模仿并处
理现实问题。
• 要求:
–高度概括、分类、和抽象。

面向对象的特点

抽象
  • 抽象是对具体对象进行概括,抽出这一类对象的公共性质并加以描述的过程。
  • –先注意问题的本质及描述,其次是实现过程或细节。
  • 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。
  • 代码抽象:描述某类对象的共有的行为特征或具有的功能。
  • 抽象的实现:通过类的定义。

例如:
抽象实例–钟表

  • 数据抽象:
       int hour,int minute,int second
  • 代码抽象:
         setTime();showTime();

抽象实例–钟表类
class Clock{
 public:
   void setTime(int h,int m,int s);
   void showTime();
 private:
   int hour,minute,second;
};

封装
  • 将抽象出的数据成员、代码成员相结合,将他们视为一个整体。
  • 目的:增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。
  • 实现封装:类定义中的{}

实例:
c++对象的基础知识

继承与派生
  • 是C++中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。
  • 实现:定义派生类
多态性

多态:同一名称,不同的功能实现方式。
目的:达到行为标识的统一,减小程序中标识符的个数。
实现:重载函数和虚函数

  1. 类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。
  2. 利用类可以实现数据的封装、隐藏、继承与派生。
  3. 利用类易于实现大型复杂程序,其模块化程度比c中采用函数更高。
  • 类的定义形式
    类是一种用户自定义类型,定义形式:
    class 类名称{
      public: 公有成员(外部接口)
      private: 私有成员
      protected:保护型成员
    }
  • 成员类型:
    1. 公有类型成员:
      在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。

    2. 私有类型成员

      • 在关键字private后面声明,只允许本类中的函数访 问,而类外部的任何函数都不能访问。

      • 如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。

          > Class point{
          > int x; int y
          > }
        
    3. 保护类型
      与private类似,其差别表现在继承与派生时对派生类的影响不同

  • 成员数据和成员函数
  1. 成员数据
    与一般的变量声明相同,但需要将
    它放在类的定义体中。

  2. 成员函数
    • 在类中说明原型,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。
    • 允许声明重载函数和带默认形参值的
    函数
    • 内联成员函数

    1. 为了提高运行时的效率,对于较简单的函数可以声明为内联形式。
    2. 内联函数体中不要有复杂结构(如循环语句和switch语句)。
    3. 在类中声明内联成员函数的方式:
      –将函数体放在类的定义中。

    c++对象的基础知识

    –使用inline关键字。

    c++对象的基础知识

对象

  1. 类的对象是该类的某一特定实体,即类类型的变量。
  2. 定义形式:
    类名 对象名; // 不用new

例:
Clock myClock;

  1. 类中成员的访问方式
    • 类中成员互访
    –直接使用成员名
    • 类外访问
    –使用“对象名.成员名” 方式访问public 属性的成员

c++对象的基础知识

构造函数和析构函数

  • 构造函数
    1. 构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。
    2. 在对象创建时由系统自动调用。
    3. 如果程序中未声明,则系统自动产生出一个隐含的参数列表为空的构造函数
    4. 允许为内联函数、重载函数、带默认形参值的函数

    构造函数的实现:
    c++对象的基础知识
    建立对象时构造函数作用:
    c++对象的基础知识

  • 拷贝构造函数
    1. 拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。
    2. 形式:
      class 类名 {
        public:
          类名 (形参;//构造函数
          类名 (类名 &对象名);//拷贝构造函数
            …
      };
      类名::类(类名 &对象名){//拷贝构造的实现
          函数体
      }

举例:
c++对象的基础知识

  1. 调用拷贝构造函数

    1. 当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现复制。当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现复制。

      c++对象的基础知识

    2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。

    3. 当函数的返回值是类对象时,系统自动调用拷贝
      构造函数。

    c++对象的基础知识

  2. 隐含的拷贝构造函数

    1. 如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的拷贝构造函数。
    2. 这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。
  • 析构函数
  1. 完成对象被删除前的一些清理工作。
  2. 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
  3. 如果程序中未声明析构函数,编译器将自动产生一个隐含的析构函数。

c++对象的基础知识

组合类

    1. 类中的成员数据是另一个类的对象。
    2. 可以在已有抽象的基础上实现更复杂的抽象。
      c++对象的基础知识
  • 类组合的构造函数设计

    1. 原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。
    2. 定义形式:
      类名::类名(对象成员所需的形参,本类成员形参)
      :对象1(参数),对象2(参数), …
      { 本类初始化 }
  • 类组合的构造函数调用

    1. 构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反)
    2. 初始化列表中未出现的内嵌对象,用默认构造函数(即无形参的)初始化
    3. 系统自动生成的隐含的默认构造函数中,内嵌对象全部用默认构造函数初始化
  • 前向引用声明

    1. 类应该先定义,后使用

    2. 如果需要在某个类的定义之前,引用该类,则应进行前向引用声明。

    3. 前向引用声明只为程序引入一个标识符,但具体定义在其他地方。

      class B; //前向引用声明
      class A {
      public:
      void f(B b);
      };
      class B {
      public:
      void g(A a);
      };

    4. 使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类定义之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。

      class Fred; //前向引用声明
      class Barney {
      Fred x; //错误:类Fred的定义尚不完善
      };
      class Fred {
      Barney y;
      };

      class Fred; //前向引用声明
      class Barney {
      public:
      ……
      void method() {
      x.yabbaDabbaDo(); //错误Fred类的对象在定义之前使用
      }
      private:
      Fred &x;//正确,经过前向引用声明,可以声明Fred类对象引用
      };
      class Fred {
      public:
      void yabbaDabbaDo();
      private:
      Barney &y;
      };