北邮C++面向对象程序设计(第三讲)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.4.1 用对象名和成员运算符访问
格式:对象名. 成员名 # include <iostream> using namespace std; class point { private: int x, y; public: void setpoint(int a, int b) {x = a; y =b; } int getx() {return x; } int gety() {return y; } };
2.6 类的封装性和信息隐蔽
C++ 通过类实现封装性。
在声明类时,一般将数据成员指定为私有,使它们与外界隔离,把让 外界调用的成员函数指定为公有,外界通过公有函数实现对数据成员 的访问。 外界与对象的唯一联系就是调用公有成员函数。公有成员函数是用户 使用类的公用接口。 通过成员函数对数据成员进行操作称为类的实现。
void set_time(Time &t) { cin>>t.hour; cin>>t.minute; cin>>t.sec; } void show_time(Time &t) { cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; }
(2)程序(c) # include <iostream> using namespace std; class Time { public: int hour; int minute; int sec; }; int main() { void set_time(Time &, int hour =0, int minute =0, int sec =0) ; void show_time(Time & ); Time t1; set_time(t1, 12, 23, 34); show_time(t1); Time t2; set_time(t2); show_time(t2); return 0; }
程序运行的情况为: 10 25 54 ↙ 10:25:54 // 输出t1的值 0: 0: 0 // 输出t2的值
3.1.3 带形参数的构造函数
void set_time (Time &t, int hour, int minute, int sec) { t. hour = hour; t. minute = minute; t. sec = sec; } void show_time(Time &t) { cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; }
void Time:: set_time() { cin >> hour; cin >> minute; cin >> sec; } void Time::show_time() { cout << hour <<":"<<minute<<":"<<sec<<endl; } int main( ) { Time t1; t1.set_time(); t1.show_time(); Time t2; t2.show_time(); return 0; }
int main( ) { Time t1; t1.set_time( ); t1.show_time( ); Time t2; t2.set_time(); t2.show_time(); return 0; } void Time::set_time() { cin>>hour; cin>>minute; cin>>sec; } void Time::show_time() { cout<<hour<<":"<<minute<<":"<<sec<<endl; }
C++面向对象程序设计
2.3.4 成员函数的存储方式
系统为每个对象分配内存空间。由于同一类对象的成员函 数相同,若为每个对象的成员函数都分配内存空间,会造 成内存浪费。
只为对象的数据成员分配内存空间。类的所有对象共享一 个成员函数空间,该空间不占用对象的存储空间。
2.4 对象成员的引用
“引用”就是如何访问对象中的成员。 有三种方法: 用对象名和成员运算符访问; 用指向对象的指Βιβλιοθήκη Baidu访问; 用对象的引用访问。
void Array_max::max_value() { int i; max=array[0]; for (i=1; i<10; i++) if (array[i]>max) max=array[i]; } void Array_max::show_value() { cout<<"max="<<max; } int main() { Array_max arrmax; arrmax.set_value(); arrmax.max_value(); arrmax.show_value(); return 0; }
信息隐蔽的好处: (1)如想修改或扩充类的功能,只需修改类中有关的数据成 员和成员函数,类外的部分不用修改。 (2)如果在编译时发现类中的数据读写有错,不必检查整个 程序,只需检查本类中访问这些数据的成员函数。
类声明和成员函数定义的分离
在面向对象程序开发中,一般将类的声明(包括成员函数 的声明)放在指定的头文件中,在程序中只要把有关的头 文件包含进来即可,不必在多个程序中重复写类的声明。
构造函数可以带参数,也可以不带参数。
构造函数可以写在类内部,也可以写在类外部。 构造函数即使被声明为公有函数,也不能被显示地调用。
例3.1在例2.3的基础上定义构造成员函数 # include <iostream> using namespace std; class Time { public: Time( ) { hour=0; minute=0; sec=0; } void set_time(); void show_time(); private: int hour; int minute; int sec; };
(2)程序(b) # include <iostream> using namespace std; class Time { public: int hour; int minute; int sec; }; int main() { void set_time(Time & ) ; / / 使用引用形参 void show_time(Time & ); Time t1; set_time(t1); show_time(t1); Time t2; set_time(t2); show_time(t2); return 0; }
例2.1 引用多个对象的成员 (1)程序(a) # include <iostream> using namespace std; class Time { public: int hour; int minute; int sec; }; int main() { Time t1; cin>>t1.hour >>t1.minute>>t1.sec; cout<<t1.hour<<“:”<<t1.minute<<“:”<<t1.sec<<endl; Time t2; cin>>t2.hour>>t2.minute>>t2.sec; cout<<t2.hour<<":"<<t2.minute<<":"<<t2.sec<<endl; return 0; }
第3章 类和对象的进一步讨论
3.1 构造函数
如果定义一个变量,在使用这个变量前要对其赋初始值, 否则其内的值不定。
对象作为变量,也需要对其中的数据成员赋初始值。这通 过构造函数来实现。 构造函数是一种特殊的成员函数,不需要调用,而是在创 建对象时自动执行。
构造函数属于某一个类,可由系统自动生成,也可以由程 序员编写。 构造函数名必须与类名同名。 构造函数没有类型,不返回值。
例2.4 在整型数组中找最大值 # include <iostream> using namespace std; class Array_max { public: void set_value(); void max_value(); void show_value(); private: int array[10]; int max; }; void Array_max::set_value() { int i; for (i=0; i<10; i++) cin>>array[i]; }
为了实现信息隐蔽,一般类成员函数的定义不放在头文件 中,而另外放在一个文件中。
// student.h 头文件,在此声明类 # include <string> using namespace std; class Student { int num; string name; char sex; public: void display( ); }; // student.cpp 文件定义函数 # include <iostream> # include "student.h" void Student :: display() { cout << num << endl; cout << name << endl; cout << sex << endl; }
例2.3 用成员函数处理例2.2中的程序 # include <iostream> using namespace std; class Time { public: void set_time(); void show_time(); private: int hour; int minute; int sec; };
2.4.2 用指向对象的指针访问
可以通过指针访问对象中的成员 class Time { public: int hour; int minute; }; Time t, *p; p= &t; cout<< p->hour<<endl;
2.5 类和对象的应用举例
例 2.1 简单的例子 # include <iostream> using namespace std; class Time { public: int hour; int minute; int sec; }; int main() { Time t1; cin>>t1.hour; cin>>t1.minute; cin>>t1.sec; cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl; }
// main.cpp 定义主函数 # include <iostream> # include "student.h" using namespace std; int main() { Student stud; stud.display(); return 0; }
作业题目(10月11日提交): 68页 第5题和第6题 。 5 、将本章的例2.4改写为一个多文件的程序: (1)将类定义放到头文件arraymax.h中; (2)将成员函数定义放在源文件arraymax.cpp中; (3)主函数放在源文件file1.cpp中。 6、求3个长方体的体积,编写一个基于对象的程序。数据成员包括length (长)、width(宽)、 height(高)。要用成员函数实现以下功能: (1)由键盘分别输入3个长方体的长、宽、高; (2)计算长方体的体积; (3)输出3个长方体的体积。
int main() { point op1, op2; int i, j; op1.setpoint(1,2); op2.setpoint(3,4); i = op1.getx(); j = op1.gety(); cout<<“op1 i=”<< i<<“opt1 j=”<<j<<endl; i = op2.getx(); j = op2.gety(); cout<<“op2 i=”<< i<<“opt2 j=”<<j<<endl; }