C_PlusPlus学习笔记 - 3_类与对象 (C++语言程序设计【第三版】 郑莉等,清华大学出版社)

来源:互联网 发布:论大数据的机遇和挑战 编辑:程序博客网 时间:2024/06/08 12:30
3——类与对象

在我们熟悉的现实世界中,一切事物都是对象。对象可以是有形的,也可以是无形的。对象可以是一个个体,也可以是由诸多其他对象组成。C++支持这种抽象,将抽象后的数据和函数封装在一起,便构成C++的“类”。

面向对象设计的基本特点
抽象:对具体问题进行概括,抽象出一类对象的公共性质并加以描述的过程。包括数据抽象和行为抽象。
封装:将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成类,其中数据和函数都是类的成员。
通过封装一部分成员充当类与外部的接口,而将其他成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。
继承:C++语言中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体、详尽的说明。
多态:多态性是指一段程序能够处理多种类型对象的能力。C++语言中,这种多态性可以通过强制多态,重载多态,类型参数化多态,和包含多态。
强制多态和重载多态为特殊化多态,只是表面的多态性。
包含多态和类型参数化多态属于一般多态性。C++通过虚函数来实现包含多态。

类与对象
类是面向对象程序设计方法的核心,利用类可以实现对数据的封装和隐蔽。
在面向过程的结构化程序设计中,程序的模块由函数构成,函数将逻辑上相关的语句和数据封装,用于完成特定的功能,而在面向对象程序设计中,程序模块由类构成,类是对逻辑上相关的函数和数据的封装,他是对问题的抽象描述。因此后者的继承程度更高,更适合大型复杂程序的开发。
int i; bool b;
另一个重要的意义通常被我们忽略,限定对变量的操作。
i可以进行算术操作,b可以进行逻辑操作。
说明每一种数据类型都包含了数据本身的属性以及对数据的操作。
哪一种语言,其基本类型都是有限的,类实际上就是自己定义的数据类型。
因此,int表示整数, 也可以自定义无限多中新类型,汽车,手表,人等等。

类的声明:
类成员包括数据成员和函数成员,分别描述问题的属性和行为。

类的成员函数:
成员函数的声明和实现
函数的原型声明要写在类体中,而函数的具体实现写在类体外。
带默认参数的成员函数。
内联成员函数,(隐式声明,显式声明)

构造函数和析构函数
类和对象的关系,就相当于基本类型和它的变量之间的关系,一般与特殊的关系。
每个对象区别于其他对象的地方主要有两个,外在的区别是对象的名称,而内在的区别则为对象自身的属性值,即数据成员的值。就像声明基本变量时可以初始化一样,在声明对象的时候,也可以同时对他的数据成员赋初值。在声明对象的时候进行数据成员的设置,成为对象的初始化。在特定对象使用结束时,还经常需要进行清理 工作。C++程序中初始化和清理工作,由两个特殊的成员函数完成,构造函数和析构函数。
构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。构造函数的函数名与类名相同,而且没有返回值,构造函数通常被声明为公有函数,只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构造函数的调用代码,因此我们通常说在对象被创建时构造函数将会自动调用。
如果类中没有写构造函数,编译器会自动生成一个默认形式的构造函数——没有参数,也不做任何事情。
构造函数可以重载。。。

拷贝构造函数
如复印机复印东西。。。对象的复制也是C++程序必不可少的。
生成对象副本有两种途径:
1.建立一个新的对象,然后将一个已有对象的数据成员取出来,一一赋给新的对象。
2.使类具有自行copy的功能。这就是拷贝构造函数的功能。
拷贝构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,其形参为本类对象的引用,其作用为使用一个已经存在的对象,去初始化一个同类的新对象。实现同类对象之间的数据成员的传递。
如果没有定义拷贝构造函数,系统会自动生成一个默认的拷贝构造函数。是把每个数据成员的值复制到新建立的对象中。
普通构造函数是在对象创建时被调用,拷贝构造函数则在:
1. 用类的一个对象去初始化该类的另一个对象时
2. 如果函数的形参为类的对象,调用函数时,进行形参和实参结合时。
3. 如果函数的返回值是类的对象,函数执行完成返回调用者时。

析构函数
处理扫尾工作。
对象会消失吗?当然会!自然界万物都是有生有灭,对象也是一样。
析构函数与构造函数正好相反,析构函数是在对象的生存期即将结束时自动调用。

类的组合
类的成员数据既可以是基本类型,也可以是自定义的类型。当然也可以是类的对象。
类的组合描述的就是一个类内嵌其他类的对象作为成员的情况,它们之间的关系为包含和被包含的关系。
例如计算机 (软件和硬件; 软件:系统软件,应用软件)可以看成类的组合。
当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。因此,在创建对象时既要对本类的基本数据成员进行初始化,又要对内嵌对象成员进行初始化。这时理解这些对象的构造函数的调用顺序就很重要。
组合类构造函数定义一般形式:
类名::类名(形参表):内嵌对象1(形参表) :内嵌对象2(形参表) 称为初始化列表,其作用为对内嵌对象进行初始化。
对基本数据成员也可以这样初始化 Circle::Circle(float r) : radius(r){}

在创建一个组合类的对象时,不仅自身的构造函数将被调用,而且调用内嵌对象的构造函数。调用顺序:
1. 调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的声明中出现的顺序。
2. 执行本类构造函数的结构体。
如果要为组合类编写拷贝构造函数,则需要为内嵌成员对象的拷贝构造函数传递参数。
C::C( C &c1):b(c1.b)

前向引用声明
在引用未声明的类之前,将该类的名字告诉编译器。
在完整声明之前,不能声明该类的对象,但可以声明该类对象的指针。

UML图形标识。。。
http://www.ibm.com/developerworks/cn/rational/rationaledge/content/feb05/bell/
http://wenku.baidu.com/link?url=BopMibQdWskd7HW_Jr_3REHqQEOFqq0DDAt-L_Wgw9D4Qfn_INnCxg28Dt21ZYuhpIrfbOizW8QCSqCTkX4tyL40Cm1pL_0zdvb8mt4y4dW



0 0
原创粉丝点击