当前位置:
文档之家› C 程序设计 第7章 类和对象的基础解析
C 程序设计 第7章 类和对象的基础解析
2.析构函数
析构函数也是类中的特殊成员函数,与类名字相 象,在前加一个波浪号“~”。它没有参数,也没 有返回值,在一个类中只能有一个析构函数。 析构函数执行与构造函数相反的操作。
通常用于释放分配给对象的存储空间,当程序超出类 析构函数的定义格式如下: 对象的作用域时,或者当对一个类指针使用运算符 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, 则成为内联成员函数。若函数较短,可以在类内定义,也称作 内联成员函数。
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; }
已有变量可以初始化另一个变量:
int a=5;int b=a; 同样,已有对象也可以初始化另一个对象。
复制构造函数是一种特殊的成员函数,其 功能是用一个已经初始化过了的对象去初 始化另一个新创建的对象。 复制构造函数的定义格式如下:
<类名>::<复制构造函数名>(<类名>&<引用名>) {<函数体>}
< 类名>:: ~ <析构函数名> 说明:
和构造函数一样,如果不定义析构函数,编译程序将 {<函数体 >} 提供一个缺省的析构函数。对大多数类来说,缺省的 析构函数就能满足要求,如果在一个对象完成其操作 之前还需要做一些内部处理,则应显式的定义析构函 注意:析构函数仅能有一个,不能重载。 数。
例7.3
例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.
构造函数的名字必须与类的名字相同,并且构 造函数无返回值,不允许定义构造函数的返回 注意:构造函数在对象创建时由系统自 值类型,包括void类型。但允许有参数。 动调用,这是它与类的普通成员函数之 构造函数是成员函数,函数体可写在类体内, 也可写在类体外。 间的最大区别。 构造函数可以重载。
2.对象的定义与使用
对象的定义格式: <类名> <对象名列表> 说明:
<类名>是定义对象所属类的名字。 <对象名列表>可有多个对象名,用逗号分隔。 TPoint TPoint TPoint TPoint
例如:
p1,p2; //定义TPoint类型的对象p1和p2。 *p=&p1; //定义指向对象p1的TPoint类型的指针p。 &c=p2; //定义c为TPoint类型对象p2的引用。 m[5]; //定义一个TPoint类型的对象数组。
定义一个汽车类 型号、外壳、车轮等(数据成员) 启动、加速和停止等(成员函数)
类的定义格式:
class <类名> { public: <公有数据成员和成员函数的说明或实现> private: <私有数据成员和成员函数的说明或实现> protected: <保护数据成员和成员函数的说明或实现> }; <各个成员函数的实现>
什么是对象?
类实例化后便生成对象。 对象(Object):含有数据(对象的属性 Attribute)又含有对数据的操作代码 (Method)的一个逻辑封装体。
属性:描述对象特征的数据。 方法:对属性的操作。 利用对象进行程序设计
面向对象编程
1. 类的定义
类的定义
一般分为说明部分和实现部分。 说明部分:类中的成员 数据成员 成员函数的说明 实现部分 成员函数的具体定义 例如:
注意:它只有一个参数,是对某个对象的引用。
例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";}
对象定义的实质
定义一个类,就相当于定义了一种类型,它并不 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();静态存储区中,为所有的对象共享。 例如: