第3章 类与对象—3
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析: 数据成员: int count; //数序中元素的个数 int a[MAX]; //存放数序的数组 成员函数: void Addnum(int n); //向有序数组中添加元素 void Delenum(int n); //从有序数组中查找元素并删除 Set( ) {count=0;} //构造函数 void Disp ( ); //输出有序数组 测试数据:Set set1,set2; set1.Addnum(3); set1.Disp( ); set1.Addnum(2); set1.Delenum(2); set1.Addnum(1); set1.Disp( );
•将其它类的成员函数声明为本类的友元函数
在一个类的定义中,可以把另一个类的成员函数声明为当前
类的友元函数,该成员函数就能访问当前类的成员。
[例3-29]教师和学生的选课中,教师可以给学生修改成绩,可以访问学 生的私有数据,所以把教师类中的成员函数SetGrade声明为学生类的 友元函数。
2
友元类
若B类是A类的友元类,则B类的所有成员函数都是A类的 友元函数 友元类通常设计为一种对数据操作或类之间传递消息的 辅助类
3.1
3.2 3.3 3.4 3.5 3.6 3.7 3.8
面向对象程序设计概述
类与对象的定义 构造函数与析构函数 对象的深复制 静态成员 常类型 友元 对象数组与类的组合
3.9
程序举例
3.6
1、常对象
常类型
const修饰的类型,既保证数据共享又防止改变数据。
定义形式:
类名 const 对象名[(实参表列)];
const 类名 对象名[(实参表列)];
常对象必须在定义时初始化并且值不能被更新 常对象的数据成员为常数据成员 常对象的成员函数不自动为常成员函数
//li3_24.cpp #include <iostream> using namespace std; class Sample { public: Sample(char c) {ch=c; } void Disp() {cout<<ch<<endl; } private: error C2662: „Disp' : cannot convert char ch; 'this' pointer from 'const class Sample' }; int main() to 'class Sample &' { const Sample a(„m‟); //a是常对象,定义时初始化 a.Disp(); //错误:a是常对象,不能调用非const成员函数 return 0; }
Biblioteka Baidu
const可以参与区分重载函数。
3.7
友元(friend)
友元是对类操作的辅助手段。友元能够引用类中本来被隐蔽
的信息 使用友元目的是基于程序的运行效率,但牺牲了封装性
运算符重载的某些场合需要使用友元
友元可以是函数,也可以是类,统称为友元
友元关系是非对称、非传递的。
Y 是 X 的友元,Z 是 Y 的友元,但 Z 不一定是X的友元,x不 一定是y的友元
#include<iostream> 用友元函数计算两点之间的距离 #include<cmath> class Point { public: Point(double x, double y) { X = x ; Y = y ;} double GetX() { return X ; } double GetY() { return Y ; } 定义函数 Distance friend double Distance ( Point & a, Point & b ) ; private: double X, Y ; }; double Distance(Point & a, Point & b ) { double dx = a.X - b.X ; double dy = a.Y - b.Y ; return sqrt ( dx * dx + dy * dy ) ; } void main() { Point p1( 4.0, 8.0 ) , p2( 5.0, 9.0 ) ; double d = Distance ( p1, p2 ) ; cout << "This distance is " << d << endl ; }
•同一个函数声明为多个类的友元函数
当一个函数需要访问多个类时,就可以将该函数声明 为多个类的友元,该函数就能访问这多个类的成员。
[例3-28]在学生选修某位教师的课程时,要求显示出学生和教师的信息, 就可以定义一个全局函数Disp,同时声明为学生类Student和教师类 Teacher的友元函数。
【例3-30】例如教师类Teacher的成员函数都要访问类Student
的成员,则把类Teacher声明为类Student的友元类。
友元应用实例: 设计一个集合Set,存放有序的整型数序,其中的元素按从 小到大的顺序排列并且不包含相同的元素,要求:
1)向数序中添加元素(过滤重复数据)并保持有序 2)从数序中查找数据元素并删除(自己完成)
2、类的常数据成员 例:const int conMbr;
类的常数据成员必须进行初始化,而且只能通过构造函数的 成员初始化列表的方式来进行。
在对象被创建以后,其常数据成员的值就不允许被修改
(只可读取其值,但不可进行改变)。
//li3_25.cpp private: const char ch1, ch2; #include <iostream> //定义常数据成员 using namespace std; }; class Sample { public: Sample(char c1,char c2):ch1(c1),ch2(c2)
#include<iostream> 用友元函数计算两点之间的距离 #include<cmath> class Point { public: Point(double x, double y) { X = x ; Y = y ;} double GetX() { return X ; } double GetY() { return Y ; } friend double Distance ( Point & a, Point & b ) ; private: double X, Y ; }; double Distance(Point & a, Point & b ) 友元函数一般带有一个该类的入口参数。因为友元函数不是 { double dx = a.X - b.X ; 类的成员,所以它不能直接引用对象成员的名字,也不能通 double dy = a.Y - b.Y ; return sqrt ( dx * dx + dy * dy ) ; 过this 指针引用对象的成员,它必须通过作为入口参数传递 } 进来的对象名或对象指针来引用该对象的成员。 void main() { Point p1( 4.0, 8.0 ) , p2( 5.0, 9.0 ) ; double d = Distance ( p1, p2 ) ; cout << "This distance is " << d << endl ; }
说明:
const是函数类型的一部分,在声明和定义时都要加const。 const成员函数即可引用const数据也可引用非const数据,但都不能改变 值。 const成员函数不能访问非const成员函数。
非const成员函数可引用const数据也可引用非const数据,但不能改变
const数据。 常对象只能调用常成员函数。
//带成员初始化列表的构造函数
{}
/*错误示例
void Set(char c1,char c2) { ch1=c1; ch2=c2;}
//错误:常数据成员不能被修改
int main() { Sample a('m','n'); //定义对象a,为常数据成员传递实参 a.Disp(); return 0; } 程序运行结果为: m,n
1、
友元函数
友元函数不是类的成员函数但可以直接访问类的成员
友元函数可以是一般函数,也可以是其它类的成员函数
友元函数在类中用friend声明,定义可在类内也可在类外
#include<iostream> 用友元函数计算两点之间的距离 #include<cmath> class Point { public: Point(double x, double y) { X = x ; Y = y ;} double GetX() { return X ; } double GetY() { return Y ; } friend double Distance ( Point & a, Point & b ) ; private: double X, Y ; }; double Distance(Point & a, Point & b ) { double dx = a.X - b.X ; double dy = a.Y - b.Y ; return sqrt ( dx * dx + dy * dy ) ; } void main() { Point p1( 4.0, 8.0 ) , p2( 5.0, 9.0 ) ; double d = Distance ( p1, p2 ) ; cout << "This distance is " << d << endl ; }
class Date{
int main() public: { Date(int y,int m,int d ); Date date1(1998, 4, 28); // int Leap() const; date1.showDate( ); const Date date2(2002, 11, 14); void showDate() ; date2.showDate( ); void showDate() const; return 0; private: } int year,month,day; }; Date::Date(int y,int m,int d ):year(y), month(m), day(d){ } void Date::showdate( ) { cout<<year<<”.”<<month<<”.”<<day<<endl; } void Date::showdate( ) const { cout<<year<<”.”<<month<<”.”<<day<<endl; }
#include<iostream> 用友元函数计算两点之间的距离 #include<cmath> class Point { public: 说明函数 Distance Point(double x, double y) { X = x ; Y = y ;} double GetX() { return X ; } 是类 Point 的友元 double GetY() { return Y ; } friend double Distance ( Point & a, Point & b ) ; private: double X, Y ; }; double Distance(Point & a, Point & b ) { double dx = a.X - b.X ; double dy = a.Y - b.Y ; return sqrt ( dx * dx + dy * dy ) ; } void main() { Point p1( 4.0, 8.0 ) , p2( 5.0, 9.0 ) ; double d = Distance ( p1, p2 ) ; cout << "This distance is " << d << endl ; }
*/ void Disp() {cout<<ch1<<”,”<<ch2<<endl; }
3、类的常成员函数
常成员函数的说明格式:
<类型说明符> <函数名> ( <参数表> ) const;
常成员函数只能读取相应对象的内容, 但无权修改它们。 修饰符const要加在函数说明的尾部 (若放在首部的话,则是对函数值的修饰)。