C 程序设计 第7章 类和对象的基础解析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.对象的定义与使用

对象中数据成员和成员函数的表示方式1:


<对象名>.<成员名> <对象名>.<成员名>(<参数表>)
p1.x,p1.y,p1.Setxy(2, 3)

例如:


对象中数据成员和成员函数的表示方式2:

<对象指针名>-><成员名> 或者(*<对象指针名>).<成员名> <对象指针名>-><成员名>(<参数表>) 或者(*<对象指针名>).<成员名>(<参数表>) p->x,p->y,p->Getxy(int a,int b) 或者(*p).x, (*p).y, (*p).Getxy(int a,int b)


p1对象
TPoint p1,p2;
二、对象的初始化


在类的定义中,无法用表达式初始化数据 成员,因此,在声明一个对象时,对象的 初始状态是不确定的,需要初始化。 对象初始化可以使用:

构造函数 析构函数 复制构造函数
1.构造函数
构造函数是一种特殊的成员函数,它主要 构造函数的定义格式如下: 用来为对象分配空间,给他的数据成员赋 <值(初始化)并执行对象的其他内部管理 类名>:: <构造函数名> 操作。 {< 函数体 >} 说明:

例7.2

问题:构造函数的定义举例。
#include <iostream> class Tpoint {public: 该程序的运行结果如下: Tpoint(int m,int n){x=m;y=n;}//定义构造函数 10,20 int Getx(){return x;} 15,25 int Gety(){return y;} private: int x,y;}; void main() { Tpoint a(10,20);Tpoint b(15,25); cout<<a.Getx()<<","<<a.Gety()<<endl; cout<<b.Getx()<<","<<b.Gety()<<endl; }
2.对象的定义与使用


对象的定义格式: <类名> <对象名列表> 说明:

<类名>是定义对象所属类的名字。 <对象名列表>可有多个对象名,用逗号分隔。 TPoint TPoint TPoint TPoint

例如:



p1,p2; //定义TPoint类型的对象p1和p2。 *p=&p1; //定义指向对象p1的TPoint类型的指针p。 &c=p2; //定义c为TPoint类型对象p2的引用。 m[5]; //定义一个TPoint类型的对象数组。

问题:构造函数和析构函数举例。
#include <iostream> class Tpoint {public: 该程序的运行结果如下: Tpoint(int m,int n){x=m;y=n;}//定义构造函数 10,20 ~Tpoint();int Getx(){return x;} 15,25 int Gety(){return y;} Destructor called. private:int x,y;}; called. Destructor Tpoint::~Tpoint(){cout<<"Destructor called.\n";} void main() { Tpoint a(10,20);Tpoint b(15,25); cout<<a.Getx()<<","<<a.Gety()<<endl; cout<<b.Getx()<<","<<b.Gety()<<endl; }
例7.4

问题:调用复制构造函数的例子。
void main() { Tpoint a(10,20); Tpoint该程序的运行结果为: b(15,25); TpointCall c(a); constructor. cout<<a.Getx()<<","<<a.Gety()<<endl; Call constructor. cout<<b.Getx()<<","<<b.Gety()<<endl; Copy constructor. cout<<c.Getx()<<","<<c.Gety()<<endl; 10,20 } 15,25 10,20 Destructor called. Destructor called. Destructor called.

例如:

例7.1

问题:对象的定义和成员函数的调用。
#include<iostream.h> #include "Tpoint.h" void main() 该程序的运行结果为 {TPoint x=1y=2 p1,p2; TPoint *p=&p1; p1.Setxy(1,2); cout<<"x="<<p1.Getx()<<"y="<<p1.Gety()<<endl; x=3y=4 p2.Setxy(3,4); x=5y=6 cout<<"x="<<p2.Getx()<<"y="<<p2.Gety()<<endl; x=11y=14 p->Setxy(5,6); //或(*p).Setxy(5,6) x=6y=8 cout<<"x="<<p->Getx()<<"y="<<p->Gety()<<endl; x=11y=14 p1.Move(1,2); p2.Move(3,4); (*p).Move(5,6); //或p->Move(5,6); p1.Print(); p2.Print(); p->Print(); }
例:坐标点类 (内联函数形式)

问题:将说明部分和实现部分都在类体内定义 。
class TPoint //类名 { public: //声明其后为公有成员 void Setxy(int a, int b) { x=a; y=b;} void Move(int a,int b) {x=x+a;y=y+b;} void Print() {cout<<"x=" <<Getx()<<"y="<<Gety();} int Getx(){ return x;} int Gety(){ return y;} private: int x,y; //数据成员 };

构造函数的名字必须与类的名字相同,并且构 造函数无返回值,不允许定义构造函数的返回 注意:构造函数在对象创建时由系统自 值类型,包括void类型。但允许有参数。 动调用,这是它与类的普通成员函数之 构造函数是成员函数,函数体可写在类体内, 也可写在类体外。 间的最大区别。 构造函数可以重载。

注意:它只有一个参数,是对某个对象的引用。
例7.4

问题:调用复制构造函数的例子。
#include <iostream> class Tpoint {public: Tpoint(int m,int n);//定义构造函数 ~Tpoint(); //定义析构函数 Tpoint (Tpoint &r);//定义复制构造函数 int Getx(){return x;}int Gety(){return y;} private:int x,y;}; Tpoint::Tpoint(int m,int n) {cout<<"Call constructor.\n";x=m;y=n;} Tpoint::Tpoint(Tpoint &r) {cout<<"Copy constructor.\n";x=r.x;y=r.y;} Tpoint::~Tpoint() {cout<<"Destructor called.\n";}

定义一个汽车类 型号、外壳、车轮等(数据成员) 启动、加速和停止等(成员函数)
类的定义格式:
class <类名> { public: <公有数据成员和成员函数的说明或实现> private: <私有数据成员和成员函数的说明或实现> protected: <保护数据成员和成员函数的说明或实现> }; <各个成员函数的实现>

< 类名>:: ~ <析构函数名> 说明:

和构造函数一样,如果不定义析构函数,编译程序将 {<函数体 >} 提供一个缺省的析构函数。对大多数类来说,缺省的 析构函数就能满足要求,如果在一个对象完成其操作 之前还需要做一些内部处理,则应显式的定义析构函 注意:析构函数仅能有一个,不能重载。 数。
例7.3
类的构造函数和析构函数注意:




类的构造函数在程序中为对象创建时分配 系统资源提供了初始化的方法; 析构函数为对象撤销时释放系统资源提供 了方法。 无论用户是否定义构造函数和析构函数, 它们都默认存在。 只要定义了新类,类的对象在创建和撤销 时,构造函数和析构函数将会被调用。
3.复制构造函数

已有变量可以初始化另一个变量:

int a=5;int b=a; 同样,已有对象也可以初始化另一个对象。


复制构造函数是一种特殊的成员函数,其 功能是用一个已经初始化过了的对象去初 始化另一个新创建的对象。 复制构造函数的定义格式如下:
<类名>::<复制构造函数名>(<类名>&<引用名>) {<函数体>}
2.析构函数


析构函数也是类中的特殊成员函数,Fra Baidu bibliotek类名字相 象,在前加一个波浪号“~”。它没有参数,也没 有返回值,在一个类中只能有一个析构函数。 析构函数执行与构造函数相反的操作。

通常用于释放分配给对象的存储空间,当程序超出类 析构函数的定义格式如下: 对象的作用域时,或者当对一个类指针使用运算符 delete时,将自动执行析构函数。
例:坐标点类

问题:将坐标点与相应操作封装成类
class TPoint { public: void Setxy(int a, int b);//说明在类体内,定义在类体外 void Move(int,int);//函数原型声明,参数名可给可不给出 void Print(); int Getx(); int Gety(); private: int x,y; //数据成员 };
例:坐标点类 (续上)

问题:将坐标点与相应操作封装成类
void TPoint::Setxy(int a, int b) { x=a; y=b;} void TPoint:move(int a,int b) { x=x+a;y=y+b;} 在类体外定义成员函数的一般格式为: void TPoint::Print(); <类名> ::<成员函数>(<参数表>) {<函数类型> cout<<"x=" <<Getx()<<"y="<<Gety();} { TPoint::Getx() int > x;} {<函数体 return } TPoint::Gety() int ::”是用来标识成员函数是属于哪个类的, {其中,作用域运算符“ return y;} “类名”是成员函数所属类的名字。若在函数前加关键词inline, 则成为内联成员函数。若函数较短,可以在类内定义,也称作 内联成员函数。
第7章 类和对象的基础
本章内容提要



类与对象的定义 对象的初始化 成员函数的特性 静态成员 友元 类的作用域与对象的生存期
一、类与对象的定义

什么是类?



类是一种新的数据类型。类是逻辑相关的函数 和数据的封装,是对所处理的问题的抽象描述, 所以,类是实现抽象类型的工具。 类(Class):是一种用户定义的类型,它包 括定义的数据和其对应的操作(函数)。 使用对象将数据和操作进行封装 (Encapsulation)。
对象定义的实质
定义一个类,就相当于定义了一种类型,它并不 int x,y 会接受或存储具体的值,只作为一个样板,只有 类TPoint 被实例化生成对象以后,系统才为对象分配存储 int x,y 空间。 p2对象 void Setxy(int a, int b); int x,y 为节省内存,在创建对象时,只为每个对象的数 void Move(int,int); void Print(); 据成员分配内存,而成员函数只是一次性存放在 int Getx(); int Gety();静态存储区中,为所有的对象共享。 例如:
什么是对象?

类实例化后便生成对象。 对象(Object):含有数据(对象的属性 Attribute)又含有对数据的操作代码 (Method)的一个逻辑封装体。

属性:描述对象特征的数据。 方法:对属性的操作。 利用对象进行程序设计

面向对象编程

1. 类的定义

类的定义




一般分为说明部分和实现部分。 说明部分:类中的成员 数据成员 成员函数的说明 实现部分 成员函数的具体定义 例如:
相关文档
最新文档