type
date
status
slug
summary
tags
category
icon
password
网址
1.面向过程:
C语言模块化程序设计--大化小分解
模块功能单一
完全依赖于数据结构--通用型编程能力差
当软件规模超过一定的尺度后,采用结构化程序设计,其开发和维护就越来越难控制。其根本的原因就在于面向过程的结构化程序设计的方法与现实世界(包括主观世界和客观世界)往往都不一致,结构化程序设计的思想往往很难贯彻到底。
在结构化程序设计中,采用的是“自顶向下,逐步细化(divide and conquer,stepwise refinement)”的思想。具体操作方法是模块化,是按功能来分的,所以也称功能块(函数)。在C++中称为一个函数,一个函数解决一个问题,即实现一个功能或一个操作。
在模块化的思想中已经出现了封装的概念,这个封装是把数据封装到模块中,即局部变量。但这是很不彻底的,因为模块是功能的抽象,而数据则是具有其个性的,一但发生那怕是一点变化,抽象的功能模块就不再适用了。可维护性差成了制约结构化程序设计应用的瓶颈。
2.面向对象的概念
对象的概念是面向对象技术的核心所在。对象是模拟现实世界中的实体。
对象的概念是面向对象技术的核心所在。面向对象技术中的对象就是现实世界中,某个具体的物理实体在计算机世界(逻辑)中的映射和体现。也就说计算机中的对象,是模拟现实世界中的实体。
从现实世界到计算机的世界映射。

总结:
类是一组相关的属性(变量)和行为(方法)的集合。是由一个抽象概念设计的产物。
对象是由一个类型实例化后的具体表现形式。就具体存在的实体。
成员变量是对象的属性(可以是变量,指针,数组等),属性的值确定对象的状态。
成员函数是对象的方法,确定对象的行为。
对象的关系:
1.包含:当对象A是对象B的属性时,称对象B包含对象A.
2.继承:当对象A是对象B的特例时,称对象A继承对象B.
3.关联: 当对象A的引用是对象B的属性时,称对象A和对象B之间是关联关系.所谓对象的引用是指对象 的名称,地址,句柄等可以获得和操纵该对象的途径。
3.类型设计与实例化对象
封装(Encapsulation)是面向对象程序设计最基本的特性,把数据(属性)和函数(操作)合成 一个整体,这在计算机世界中是用类与对象实现的。
C++中类的设计:
私有和保护体现了封装--外部不能进行访问,本身可以
访问限定符(access specifier)有三种: public (公共的), private (私有的)和 protected(保护的)。
public :可以访问类所产生对象的公有成员,不能访问类所产生对象的私有成员和保护成员。
如果在类体起始点无访问说明符,系统默认定义为私有( private )。访问说明符 private (私有 的)和 protected (保护的)体现了类具有封装性(Encapsulation)。
成员函数
对于类的数据成员,用方法操作。
类型设计的更关键部分是对数据成员的操作,用函数来完成:
C++对象模型
属性(数据成员)的值不同,行为(操作)是函数相同。
系统仅为每个对象分配一个数据区,代码区(放成员函数的区域)为各对象类共用。

编译器对C++代码:
1.扫描class(类型)--寻找记录属性;
2.扫描class(类型)--寻找记录函数(返回类型,函数名,参数表);
3.改写--对成员方法增加this指针,对主函数处理时(对象名.调用方法)传递对象地址。
尽可能将类的成员函数(不改变当前函数的值)修饰成常方法 [修饰this指针] ,提升程序的通用性--普通对象,常对象均可用。e.g.float GetTotal() const ...71
对象.访问指针->访问
继承和派生
1.面向对象的三大特征:
封装,继承和派生,多态性
封装:
封装:(Encapsulation)是面向对象程序设计最基本的特性,把数据(属性)和函数(方法,操
作)合成一个整体,这在计算机世界中是用类与对象实现的。
继承和派生:(继承和派生一体两面)
继承(inheritance)机制:是类型层次结构设计中实现代码的复用重要手段。
派生:保持原有类特性的基础上进行扩展,增加新属性和新方法,从而产生新的类型。
在面向对象程序设计中,继承和派生是构造出新类型的过程。呈现类型设计的层次结构,体现了程
序设计人员对现实世界由简单到复杂的认识过程。
2.继承的概念与定义
层次概念是计算机的重要概念:
C++ 通过类派生( class derivation)的机制来支持继承。被继承的类称为基类(base class)或超
类(superclass),新产生的类为派生类(derived class)或子类(subclass)。基类和派生类的集合
称作类继承层次结构(hierarchy)。
由基类派生出,派生类的设计形式为:
示例:
总结:派生反映了事物之间的联系,事物的共性与个性之间的关系。派生与独立设计若干相关的类,前者工作量少,重复的部分可以从基类继承来,不需要单独编程。继承是类型设计层面上的复用。
3.编制派生类时可分四步

注意:
构造函数和析构函数不能被继承。 我们知道构造函数和析构函数是跟对象的创建与消亡的善后工作相关。我们所创建派生类的对象,虽然和基类的对象有相同之处,但是仍然是不同的对象。所以,适用于基类的构造函数和析构函数不可能完全满足派生类对象的创建和消亡的善后工作。因此,构造函数
和析构函数不被继承。
第二: 其他函数都可以通过类对象来调用,创建对象时由系统调用该对象所属类的构造函数,在该对象生存期中也只调用这一次。由继承而来的派生类对象,是能够调用父类的函数,但不能调用构造函数也不能调用析构函数。
继承方式,亦称为访问控制,是对基类成员进一步的限制。继承方式也是三种:
公有(public)方式,亦称公有继承
保护(protected)方式,亦称保护继承
私有(private)方式, 亦称私有继承。
不同继承方式的区别
两层继承关系中的数据成员(可见性与访问控制)
总结:二层继承关系中对象的存储结构和访问控制。
C++对象模型,继承关系

总结
- 不论采取何种继承方式,基类中所有数据成员都将继承到派生类。
- 在类型的继承层次结构中,保护属性当作公有属性来使用。
- 继承性具有传递性。
- 无论采取何种继承方式,派生类对象的成员方法都可以去访问基类对象中的保护和公有属性。 基类对象与成员对象的区别。 多层继承关系中的数据成员(可见性与访问控制)
总结:多层继承关系中对象的存储结构和访问控制。
C++ 对象模型

继承来的对象与成员对象的区别(访问控制)
总结:保护属性的访问控制。
同名隐藏(成员属性)
总结:理解同名隐藏,与函数重载的区别。
继承关系中的函数成员(可见性与访问控制)
公有继承:“是一个 ”
派生类与基类:
赋值兼容规则
C++面向对象编程中一条重要的规则是:公有继承意味着 "是一个" 。一定要牢牢记住这条规则。
在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。它包括
以下情况:
- 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的隐藏对象赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。
- 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员。同样也不能反过来做。
- 派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的隐藏对象。

继承关系中的构成函数与析构函数
公有继承中派生类型对象构造和析构。
继承关系中拷贝构造函数
1.程序设计者在基类和派生类中都没有定义拷贝构造函数;C++编译器将自动产生按位拷贝的拷贝构造函数;在派生类的拷贝构造函数的初始化表中,加入基类拷贝构造函数的调用,是C++编译器合成的代码;(完成行为的统一);// 0 0
2.程序设计者在基类中定义拷贝构造函数;而在派生类中没有定义拷贝构造函数;C++编译器将会在派生类中自动产生按位拷贝的拷贝构造函数。并合成代码,调用(关联)基类的拷贝构造函数。// 1 0
3.程序设计者在基类和派生类中都定义了拷贝构造函数;程序设计者在派生类中,没有指定调用基类的拷贝构造函数时。C++编译器合成的代码调用基类的缺省构造函数,如果基类中没有缺省构造函数。合成代码失败。编译错误。// 1 1
4 . 程序设计者在基类中没有定义拷贝构造函数(C++编译器将自动产生按位拷贝的拷贝构造函数)。而在派生类中定义了拷贝构造函数。程序设计者在派生类中,没有指定调用基类的拷贝构造函数时。C++编译器合成的代码调用基类的缺省构造函数,如果基类中没有缺省构造函数。// 0 1
继承关系中赋值运算符的重载
1.程序设计者在基类和派生类中都没有重载operator=函数; C++编译器将在基类和派生类中自动产生按位赋值的,重载operator=函数;C++编译器会在派生类的重载赋值函数中,加入基类重载赋值函数的调用,是C++编译器合成的代码;(完成行为的统一);// 0 .
2.程序设计者在基类中定义重载赋值函数;而在派生类中没有定义重载赋值函数;C++编译器将会在派生类中自动产生按位赋值的重载赋值函数。并合成代码,调用(关联)基类的重载赋值函数。
3,程序设计者在基类和派生类中都定义了重载赋值函数;程序设计者在派生类中,没有指定调用基类的重载赋值函数时。C++编译器不会合成调用基类的重载赋值函数的代码。要在派生类的重载赋值函数调用基类的重载赋值函数,程序设计者必须自己加入调用代码。 1 1
4.程序设计者在基类中没有定义重载赋值函数(C++编译器将自动产生按位赋值的重载赋值函数)。而在派生类中定义了重载赋值函数。程序设计者在派生类中,没有指定调用基类的重载赋值函数。C++编译器不会合成调用基类的重载赋值函数的代码。