C++面向对象程序设计-学习阶段性总结

阶段性总结:

  • 前言:

本课程为面向对象程序设计,以c++作为教学语言,首先抛开语言不谈,语言只是程序的实现工具,最重要的还是理解面向对象的思想。总的来说,面向对象有三大特点,即:封装、继承、多态。这个三个特点是面向对象的精髓。所谓的面向对象,是指将一个具体的物品或事件,抽象为一个“类“,这个类里所存放的东西(成员)分为两部分,一是属性(类包含的数据项,或者叫做成员变量),二是行为(C++中成为成员函数,java中也称作方法,是类所能实现的功能)。当然,我们所讲的是抽象,并不能对一个事物的各方面都面面俱到,只是提取我们所需要的方面。

  • 抽象化的过程——封装的概念。
  1. 封装,字面意思是把一些东西打包封装,我们在程序中抽象化一件事物的过程中,选取对事物所需要的部分,集中放在类中,就是封装。封装的好处:
    1. 使数据模块化,程序更加清晰,易于修改。
    2. 保护或防止代码(数据)在无意中被破坏。保护类中的成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问(数据封装)。
    3. 用类实现封装,用封装来实现高内聚,低耦合。

内聚:指一个模块(类)内部各个部分之间的关联程度

         耦合:指各个模块(类)之间的关联程度

  1. 抽象,把一堆实体的共同特征给提取出来。
  2. 实例化。

类是抽象的结果,那么我们要具体定义一个事物,就叫抽象的类来实例化一个对象。

对象是类实例化的结果。实例化与抽象是相反的过程。

举个例子:在非洲的大草原上,有斑马、角马、河马、狮子等等动物,那么我们可以把这些动物抽象为一个动物类,class Animal,类中包含:属性有四肢、驱赶、皮毛等;行为有吼叫、捕食、奔跑等;这是模糊的抽象。我们实例化一个对象,例如斑马:属性中的皮毛是黑白相间的,光滑的,行为中的捕食是食草的。这是一个相对具体的实例化过程,后面我们所讲到的继承、多态是更加具体的实例化过程。

  • 实例化过程——更加具体的实例化——继承。
  1. 类中的三种权限。

继承是一个类继承另一个类中的东西。这个过程涉及到类中成员的权限问题。public 公共权限、protected 保护权限、private 私有权限三种权限。

  1. 对于单个类而言,private代表类内私有成员,仅有类内函数可以访问private,类外一切函数(包括继承者)均不可访问private成员。Protected同上。

public代表类内公有成员,无论类内还是类外(包括继承者)的函数都可以访问public成员。在未声明成员权限时,C++中默认是私有权限。

对于继承一个及一个以上的类,这三种权限的继承也会发生改变。被继承的成为父类或基类,继承而来的类称为子类或派生类。继承方法也分为共有、私有、保护继承三种继承方式。在未声明继承方式时,c++中默认是私有继承。因继承方式不同而会改变类中成员访问权限,如图:

  1. 访问方式。

谈及三中权限,就不可避免的讨论访问方式。

访问,可以理解为调用类的成员函数,修改类中的成员变量。访问分为两种途径:

Class A

{ public

void fun1();

void fun2() { fun()1 };

int number;

};

A a;

A *p=new A;

(1)类内访问 (2)类外访问。

  1. 类内成员函数的相互调用和修改成员变量。
  2. 类外,通过实例化的对象访问对象中的成员。(对象与类是两个概念,类相当于类型,对象相当于类类型定义的一个结构体,当然结构体里没有函数,意会就可)

此外还可通对象指针去访问。p ->fun1();

  1. 继承的优点:
  1. 继承可以将实例化的过程变得更加具体,如上例所讲的实例化得到的斑马,那么,我们也能从动物类继承得到斑马类(class Zebr:public Animal)而因生存环境不同,斑马又分为细纹斑马、山斑马、草原斑马三种。当细纹斑马继承斑马类,得到细纹斑马类(一个类可以从多个类中继承),其中包含动物类、斑马类的所有成员,同时我们也能在派生类中增加和修改成员。细纹斑马类中,如修改皮毛成员为灰白相间,增加一个跳跃动作的成员函数等。
  2. 继承能使类更有层次,结构清晰。继承基类中的成员,无需重新定义类,使程序编写更加方便快捷。
  3. 个人认为:继承也体现了封装。因为继承是基类与派生类对应,虽然继承有一对多,多对多,多对一等关系,但是不妨碍它们之间的逻辑关系,这点是清晰明了的。且在继承方式的条件下继承,使每个类都有自己独立的成员也有从其他类继承而来的成员。这种自上而下由父到子的关系,是逻辑严密、严丝合缝的,使类成为一个具有内部数据的自我隐藏能力、功能独立的模块。
  • 多态——面向对象的灵魂
  1. 多态可以理解为多种形态,同一个函数在不同类下拥有不同的功能实现。实现多态的方法分为两种:(1)静态多态——重载函数;(2)动态多态——虚函数。
  2. 静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,没有的话就会发出警告或者报错。

在程序运行前,重载的函数就已预编译了,由调用函数的参数列表为依据,调用重载函数。参数列表必须满足实参的类型、个数、顺序三者之一不同即可发生重载。重载是静态联编。

  1. 动态多态: 显然这和静态多态是一组反义词,即在程序的运行过程中,根据基类指针指向的派生类对象,动态的调用函数相同但实现功能不同的函数。其中函数相同,是指函数的返回类型(协变除外)、函数名、参数列表完全一致。
  2. 动态多态的条件: 
    基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。Virtual关键字声明虚函数。 
    通过基类对象的指针或者引用调用虚函数。
  3. 下面的几个函数都不能定义为虚函数: 
    1)友元函数,它不是类的成员函数 
    2)全局函数 
    3)静态成员函数,它没有this指针 
    3)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数)
  4. 多态的调用原理:

派生类虚表(构造函数在初始化时首先创建):存放每个类所包含的虚函数的指针,类不包含虚函数则不会创建虚表。

1.)先将基类的虚表中的内容拷贝一份

2.)如果派生类对基类中的虚函数进行重写,使用派生类的虚函数替换相同偏移量位置的基类虚函数

3.)如果派生类中新增加自己的虚函数,按照其在派生类中的声明次序,放在上述虚函数之后

总结:多态发生时,先查找类的虚函数表,找到表中的虚函数地址,在进行调用。

  • 其他——一些注意的问题和知识点。
  1. 类中子对象使用前,需要在类外先声明或定义。
  2. 2.new运算符在堆区开辟的空间,需delect/delect[ ]手动释放。
  3. 类内成员注意声明访问权限,一般为pubilc共有访问权限。
  4. 构造函数、析构函数的调用顺序。
  5. 虚析构函数的作用:避免子类中开辟的内存空间未释放,而造成的内存泄漏。
  6. 纯虚函数的定义格式:virtual <函数返回值类型> <函数名> = 0;当类中出现纯虚函数时,该类为抽象类。抽象类不可以实例化对象,要在继承后的子类中重写纯虚函数,否则便失去了纯虚函数的意义。

学而不思则惘,思而不学则殆。

以上,个人观点及经验总结,不足之处还望多多指教、相互学习。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值