4_面向对象编程技术-类与对象(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
示例(tdate.h) class TDate { public: void SetDate(int y,int m,int d); int IsLeapYear(); void Print(); private: int year,month,day; }; void TDate::SetDate(int y,int m,int d) 成员函数定义 { year=y; 作用域运算符 month=m;
• 如果紧跟在类名称的后面声明私有成员,则关键字
private可以省略。
• 公有类型成员
– 在关键字public后面声明,它们是类与外部 的接口,任何外部函数都可以访问公有类型 数据和函数。
类概念和定义
• 保护类型
– 与private类似,其差别表现在继承与派生时 对派生类的影响不同。
定义类时的注意事项
类概念和定义
• 成员数据
– 与一般的变量定义相同,但需要将它放在类 的定义体中。
• 成员函数
– 在类中说明原形,在类外定义函数体实现, 并在函数名前使用类名加以限定。也可以直 接在类中定义函数体,形成内联成员函数。 – 允许定义带缺省形参值的函数。
类概念和定义
• 私有类型成员
– 在关键字private后面声明,只允许本类中的 函数访问,而类外部的任何函数都不能访问。
内联函数和外联函数
例:分析下列程序的输出结果。 #include <iostream.h> class A { public: A(int x,int y) {X=x;Y=y;} 内联 int a() {return X;} 函 int b() {return Y;} 数 int c(); int d(); private: int X,Y; };
数据成员: <对象名>-><成员名> 成员函数: <对象名>-><成员名>(<参数表>) 例如: Pdate->year, Pdate->SetDate(1998,4,9);
对象成员的表示方法(续)
• ->运算符与.运算符的区别 ->表示指向对象的指针的成员; .表示一般对象的成员; • 两种等价表示 <对象指针名>-><成员名> (*<对象指针名>).<成员名>
跳;
说话;
跳;
说话;
跳;
说话;
类概念和定义
• c++中的类
– 类是具有相同属性和行为的一组对象的集合,它为 属于该类的全部对象提供了统一的抽象描述,其内 部包括属性和行为两个主要部分。 – 利用类可以实现数据的封装、隐藏、继承与派生。 – 类是一种复杂数据类型,它是将不同类型的数据和 与这些数据相关的操作封装在一起的集合体; – 利用类易于编写大型复杂程序,其模块化程度比C 中采用函数更高。
类概念和定义
• 类的定义形式
– 类是一种用户自定义类型,定义形式:
class 类名称 { public: 公有成员(外部接口) private: 私有成员 protected: 保护型成员 }
类概念和定义
• 类的成员
class Watch 成员函数 { public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour, Minute, Second; }; 成员数据
// 用指针访问对象成员 #include<iostream.h> class Tclass { public :
int x, y ;
void print() { cout << x << "," << y << endl ; } ; }; int add( Tclass * ptf ) { return ( ptf->x + ptf->y ) ; } void main() { Tclass test, * pt = new(Tclass) ; pt->x = 100 ; pt->y = 200 ;
locationB和locationA的数据成员有相同的值。
(2)对象可以作为数组的元素。 Location arrayloc[100];
arrayloc是以结构Location为元素的数组。
(3)可以说明指向对象的指针,但不能取私有数据
成员的指针或成员函数的地址。
Location location; Location *pointLoc = &location;
面向对象编程技术-类和对象
• 类概念和定义
• 对象
• 构造函数
• 析构函数
• 类的应用举例 • 类的聚集 • 类模板
对象和类
person
属性: 年龄;
Sandy
属性: 年龄:24
Jack
属性: 年龄:22
性别;
身高; 体重; 动作: 跑;
性别:F
身高:1.78 体重: 50 动作: 跑;
性别:M
身高:1.80 体重: 60 动作: 跑;
对象
• 类中成员的访问方式
– 类中成员互访
• 直接使用成员名
– 类外访问
• 使用“对象名.成员名”方式访问 public 属性 的成员
对象成员的表示方法
1、一般对象
.运算符:表示对象的成员
数据成员: <对象名>.<成员名> 成员函数: <对象名>.<成员名>(<参数表>) 例如: date1.year, date1.month, date1.day; date1.SetDate(1998,4,9); ->运算符:表示对象的成员 2、指针对象
内联函数和外联函数
内联函数 inline A::c() { return a()+b(); } 内联函数 inline int A::d() { return c(); } void main() { A m(3,5); int i=m.d(): cout<<"d() return:"<<i<<endl; }
用指针 访问对象成员
pt->print() ;
test.x = 150 ; test.y = 450 ; test.print() ;
来自百度文库
向函数 传递对象地址
cout << "x+y=" << add(&test) ;
}
对象的5种操作 (1)对象之间可以相互赋值。 Location locationA, locationB; locationA.set (5,6); locationB = locationA;
• 类范围(class's scope)
类的数据成员和成员函数属于该类的类范围。
• 成员函数在类中有函数范围
成员函数内定义的变量只能在该函数内访问。
• 如果成员函数定义与类范围内的变量同名的变量, 则在函数范围内,函数范围内的变量掩盖类范围内的变量。 这种隐藏变量可以通过在前面加上类名和作用域运算符(::)而 访问。
• 类的作用域
指类定义和相应的成员函数的定义范围。
在该范围内,一个类的成员函数对数据成员有访问权限。 在类的作用域外,数据成员和成员函数的访问受限。 即把一个类的数据结构和功能封装起来。 Class X{ public: void X::fun1( ) { m=5 }; void X::fun2( ) { int m; m=22; // X::m被屏蔽}
• 可以是一般的对象名,还可以是指向对象的指针名或 引用名,也可以是对象数组名
定义对象的几种形式
class Tdate d1,d2; class // 把Tdate class和Tdate合起来作为一个类名 { public: Time sunset; // object of type Time Tdate d1,d2; void Set(int m, int d, int y ){…} class //无类名 // 直接用类名定义对象。 Time times[ 5 ]; // array of Time objects int IsLeapYear(){…} { void Print( ){…} // pointer to a Time object Time *pTime ; private: //声明以下部分为私有的 private: ┆ Time &dinnerTime int month; = sunset; public: //声明以下部分为公用的 int day; // reference to a Time object ┆ int year; } } d1, d2; d1,d2; //定义了两个无类名的类对象
定义类时的注意事项(续)
k 自身类的指针或引用, class N; 可以作该类的成员;
class M k 当另一个类的对象作为 { 该类的成员时,如果另 public: …... 一个类的定义在后,需 private: 要提前说明; n是N类的对象 N *n; k 一般在类体内先说明用 }; 户感兴趣的公有成员, class N 再说明私有成员; { public: k 习惯将类定义的说明 void f(M m); 部分或者整个定义部 …… m是M类的对象 分(包含实现部分)放到 };
输出: d() return:8
类概念和定义
• 内联成员函数举例(二)
class Location { public: void Init(int initX,int initY); int GetX(); int GetY(); private: int X,Y; };
inline void Location:: Init(int initX,int initY) { X=initX; Y=initY; } inline int Location::GetX() { return X; } inline int Location::GetY() { return Y; }
void fun1( );
void fun2( ); private:
int m ;
};
对象
• 类的对象是该类的某一特定实体,即类类型的变量。 实例化(Initializing) • 指创建一个类的实例; • 对象是类的实例(即是一个具体的例子)。 • 定义形式: 类名 对象名表; • 对象名表可以有一个或多个对象名,多个对象名用逗 号分隔。
类定义的说明
• 访问权限修饰符:公有的(public)、私有的 (private)和保护的(protected);
• 访问权限修饰符出现的先后次序无关,并且允 许多次出现; • 缺省访问权限为私有的; • 公有部分:一些操作(即成员函数),是提供 给用户的接口功能; • 私有部分:一些数据成员,通常用来描述该类 中的对象的属性;
类概念和定义
• 内联成员函数举例(一)
class Location { public: void Init(int initX,int initY) { X=initX; Y=initY; } int GetX() {return X;} int GetY() {return Y;} private: int X,Y; };
• 在类体中不允许对所定义的数据成员进行初始化; class TDate { public: …... private: int year(1998),month(4),day(9); 错误 }; • 类中的数据成员的类型可以是任意的; k 包含整型、浮点型、字符型、数组、指针和引 用等; k 另一个类的对象,可以作该类的成员; k 自身类的对象不可以作该类的成员;
day=d;
} 成员函数定义 int TDate::IsLeapYear() { return (year%4==0 && year%100!=0)|| (year%400==0) } 成员函数定义 void TDate::Print() { cout<<year<<"."<<month<<"."<<day<<endl; } 作用域运算符:: 作用: 格式: 标识某个成员属于哪个类; <类名>::<函数名>(<参数表>)
一个头文件中;
提前说明类N
类概念和定义
• 内联成员函数
– 为了提高运行时的效率,对于较简单的函数可以声 明为内联形式。 – 内联函数体中不能有循环语句和switch语句。 – 在类中声明内联成员函数的方式:
• 将函数体放在类的声明中。
• 定义在类体外,但使用inline关键字进行说明的成员函数;
• 外联函数:说明在类体内,定义在类体外的成 员函数;