面向对象进阶 对象的生存期 静态成员 友元关系 常对象与常成员 对象数组与对象指针 向量类 :vector 字符串类 :string 2

Similar documents
C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

《计算概论》课程 第十九讲 C 程序设计语言应用

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

Microsoft Word - 新1-12.doc

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

程序设计语言及基础

北京大学

无类继承.key

untitled

Microsoft PowerPoint - string_kruse [兼容模式]

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

02

新版 明解C++入門編

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Microsoft PowerPoint - 10 模板 Template.pptx

c_cpp

PowerPoint 演示文稿

内 容 提 要 指 针 持 久 动 态 内 存 分 配 字 符 串 ( 字 符 数 组 ) 2

模板

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

第五讲 C++程序的结构

chap07.key

幻灯片 1

extend

FY.DOC

第五讲 数组 一维数组 二维数组 数组作为函数参数

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

《C语言程序设计》教材习题参考答案

Guava学习之Resources

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1

程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineer

《C语言程序设计》第2版教材习题参考答案

新・解きながら学ぶJava

Guava学习之CharSequenceReader

Chapter12 Derived Classes

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

没有幻灯片标题

Microsoft Word - 第3章.doc

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

Microsoft PowerPoint - 07 派生数据类型

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

Strings

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

Microsoft PowerPoint - 04-Inheritance.ppt

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

第六讲 数组、指针与字符串

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Struts2自定义类型转换.doc

C/C++程序设计 - 字符串与格式化输入/输出

untitled

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

幻灯片 1

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1

untitled

IO

Microsoft PowerPoint - 第06讲_继承.ppt [兼容模式]

北京大学

untitled

Strings

幻灯片 1

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

untitled

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B,

CHAPTER VC#

Microsoft PowerPoint - L17_Inheritance_v4.pptx

提问袁小兵:

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

C 1

4. if 与 else 在使用过程中为避免嵌套出现二义性,C++ 中规定与 else 子句配对的是 ( ) A. 其之前最近的 if 语句 B. 其之前最近且尚未配对的 if 语句 C. 缩排位置相同的 if 语句 D. 其之后最近的 if 语句答案 :B 解析 :C++ 中规定与 else 子句

概述

2015年计算机二级(C语言)模拟试题及答案(三)

9.2 构造函数和析构函数 类的组合 结构体与联合体 类的 UML 描述 第十讲 类与对象 (II) 面向对象进阶 对象的生存期 静态成员 友元关系

软件工程文档编制

fvalue = (pdata[y][i] + pdata[y][i + 1]) / 2; pdata[y][nhalfw + i] -= fvalue; fvalue = (pdata[y][nhalfw - 1] + pdata[y][nhalfw - 2]) / 2; pdata[y][nwi

C/C++语言 - C/C++数据

第七讲 继承与多态

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 30 日 1

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D>

CHAPTER 1

C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Microsoft Word - 01.DOC

CC213

PowerPoint 演示文稿

幻灯片 1

C++ 程序设计 实验 1 - 参考答案 MASTER 2017 年 5 月 21 日 1

姓名 : 年级专业 : 学号 : 凡年级专业 姓名 学号错写 漏写或字迹不清者, 成绩按零分记 密 封 线 java 较难 试卷 总分 题号 一 二 三 四 五 题分 得分 D 国际通信协议 4 下面选项中, 不是面向对象的特征的是 ( ) A 封装 B 继承 得分 一 单选题 ( 每题 3 分,

Transcription:

第十讲 类与对象 (I) 面向对象进阶

面向对象进阶 对象的生存期 静态成员 友元关系 常对象与常成员 对象数组与对象指针 向量类 :vector 字符串类 :string 2

对象的生存期 与普通变量一样, 对象有静态和动态生存期 静态生存期 : 生存期与程序的运行期相同, 即一直有效 动态生存期 : 当对象所在的程序块执行完后即消失 全局对象 : 静态生存期 动态对象 : 动态生存期 3

类作用域 类作用域 : 数据成员与局部变量 数据成员可以被类中的所有函数成员访问 ( 类似全局变量 ) 成员函数中声明的变量是局部变量 如果成员函数中声明了与数据成员同名的变量, 则数据成员被屏蔽 4

例 : 数据成员作用域 class Point //Point 类的声明 { public: // 外部接口 Point(double a, double b) { x=a; y=b;} void myfun() { cout << x << endl; int x=10; cout << x; } private: // 私有数据 int x, y; }; int main() { Point A(4,5); A.myfun(); return 0; } ex10_class_01.cpp 5

静态成员 为什么要静态 静态数据成员 静态函数成员 关键字 static 6

类的静态成员 静态数据成员和静态函数成员一般情况下, 同一个类的不同对象分别有自己的数据成员, 名字一样, 但各自有值, 互不相干 但有时希望某些数据成员为所有对象所共有, 这样可以实现数据共享 全局变量可以达到共享数据的目的, 但其安全性得不到保证 : 任何函数都可以自由修改全局变量的值, 很有可能偶然失误, 全局变量的值被错误修改, 导致程序的失败 因此在实际工作中尽量少使用全局变量 如果需要在同一个类的多个对象之间实现数据共享, 可 以使用静态数据成员 7

静态数据成员 静态数据成员 用关键字 static 修饰 该类的所有对象共同使用和维护该成员 静态变量可以初始化, 但必须在类外部初始化 例 : class Point { public:...... private: int x, y; static int count; // 引用性声明 }; int Point::count=0; // 静态数据成员的定义和初始化...... 8

静态数据成员 静态数据成员为类的所有对象共有, 不属于任何特定对象 静态数据成员在内存中只占一份空间 只要在类中定义了静态数据成员, 即使不定义对象, 也为静态数据成员分配空间, 它可以被引用 如果静态数据成员没有初始化, 则系统会自动赋予初值 0 静态数据成员既可以通过对象名引用, 也可以通过类名来引用, 即 : 对象名. 静态成员名或类名 :: 静态成员名 ex10_static_01.cpp 9

静态函数成员 静态函数成员 用关键字 static 修饰, 为整个类所共有 调用方式 : 类名 :: 静态函数成员名 没有目的对象, 所以不能对非静态数据成员进行默认访问 静态成员函数一般用于访问静态数据成员, 维护对象之间共享的数据 例 : class A 静态成员函数声明时需加 static, { public: 但定义时不能加 static...... static void fun(a a);...... }; 实际上也允许通过对象名调用静态成员函数, 但此时使用的是类的性质, 而不是对象本身 10

静态函数成员 静态成员函数可以直接访问静态成员, 但不能直接访问非静态成员 // 静态成员函数中有以下语句 : cout << height; // 若 height 是 static, 则合法 cout << width; // 若 width 是非静态数据成员, 则不合法 静态成员函数访问非静态数据成员时, 需指明对象 cout << p.width; // 访问对象 p 的非静态数据成员 width ex10_static_02.cpp 编程好习惯 : 静态成员函数只引用静态数据成员, 逻辑清楚, 不易出错 11

友元 什么是友元关系 为什么要定义友元 友元函数 友元类 关键字 friend 12

类的友元 友元关系 : 提供一种不同类或对象的函数成员之间 类的函数成员与一般函数之间进行数据共享的机制 通俗说法 : 一个类主动声明哪些类或函数是它的朋友, 从而给它们提供对本类的访问特许, 即可以访问私有成员和保护成员 友元提供了一种数据共享的方式, 提高了程序效率和可读性 但友元在一定程度上破坏了数据封装和数据隐藏的机制 友元包括 : 友元函数与友元类 友元类的所有函数成员都是友元函数 13

友元函数 友元函数 用关键字 friend 修饰 可以是普通函数或其它类的成员函数 友元函数可以通过对象名直接访问私有成员和保护成员 例 : class Point { public:...... friend float dist(point & p1, Point & p2); private: int x, y; }; float dist(point & p1, Point & p2) { double x=p1.x-p2.x, y=p1.y-p2.y; return sqrt(x*x+y*y); }...... 14

友元类 友元类 用关键字 friend 修饰 友元类的所有函数成员都是友元函数 class A { public:...... friend class B; // 声明 B 是 A 的友元类...... }; 除非确有必要, 一般并不把整个类声明为友元类, 而只将确实有需要的成员函数声明为友元函数, 这样更安全 15

友元类 关于友元关系的几点说明 友元关系不能传递 友元关系是单向的 友元关系不能被继承 面向对象程序设计的一个基本原则是封装性和信息隐蔽, 而友元是对封装原则的一个小的破坏 但是它能有助于数据共享, 提高程序的效率 在使用友元时, 要注意它的副作用, 不要过多地使用友元, 只有在使用它能使程序精炼, 并能大大提高程序的效率时才用友元, 否则可能得不偿失 16

常对象与常成员 为什么需要常对象 常对象的声明 常数据成员 常函数成员 常引用 关键字 const 17

常对象 将对象声明成常对象, 可以有效地保护数据 const 类名 对象名 ; // OK 类名 const 对象名 ; // OK 常对象必须进行初始化 常对象 : 数据成员均为常量 注 : 不能通过常对象调用普通成员函数! 常对象只能作为常成员函数的目的对象! 18

常成员 常成员函数 类型说明符 函数名 ( 形参 ) const; 常对象只能调用常成员函数 常成员函数可以被普通对象调用 无论对象是否为常对象, 常成员函数的目的对象都将被视为常对象 常数据成员 将数据成员声明为常量 必须初始化 ( 采用参数初始化表, 不能在构造函数内赋值 ) // 假定数据成员 a 和 b 是常量,c 是普通变量 Myclass::Myclass(int x, int y, int z): a(x), b(y) { c=z; } 19

常成员 class Myclass {...... void display() const; void show();...... const int a; int b; }; Myclass::Myclass(int x, int y): a(x) { b = y; }...... int main () { Myclass obj1(2,3); const Myclass obj2(4,5); Myclass const obj3(6,7); obj1.display(); // OK obj2.display(); // OK obj3.display(); // OK obj1.show(); // OK obj2.show(); // ERROR obj3.show(); // ERROR } ex10_class_const.cpp 20

常引用 常引用 const 类名 & 引用名 ; 常引用可以绑定到常对象, 也可以绑定到普通对象 不能通过常引用来修改常引用所绑定的对象 普通引用不能绑定到常对象 在 C++ 编程中, 经常用常指针和常引用作函数参数, 这样 既可以节省存储量和运算时间, 又能保证数据的安全 ex10_ref_const.cpp 21

对象数组与对象指针 对象数组的声明与初始化 指向对象的指针 this 指针 指向成员的指针 创建动态对象 特殊符号 :-> 关键字 :new delete 22

对象数组 一维对象数组的声明类名数组名 [n] 一维对象数组的引用数组名 [k]. 成员名 初始化 : 对每个元素都调用构造函数 例 :..... Point() { x=0; y=0} Point(int a, int b) { x=a; y=b; }...... int main() { Point A[2]={Point(), Point(2,3)};...... 23

对象指针 对象指针 : 指向对象的指针, 存放对象的地址 对象指针的声明类名 * 对象指针名 例 : Point a(1,2); Point * pa = &a; 使用对象指针访问对象成员 : -> 对象指针名 -> 成员名 也可以使用普通方式, 即 : (* 对象指针名 ). 成员名 常对象 指向常量的指针 ( 声明时加 const) 24

this 指针 this 指针 : 隐含在非静态成员函数中的特殊指针, 指向目的对象 this 指针是常指针 当局部作用域中声明了与类成员同名的标识符 ( 如变量名 ) 时, 可以通过 this 指针访问该类的成员 当通过一个对象的调用成员函数 ( 非静态成员函数 ) 时, 系统会把该对象的起始地址赋给成员函数的 this 指针 非静态成员函数有 this 指针, 而静态成员函数没有 this 指针 25

例 :this 指针 class Point //Point 类的声明 { public: // 外部接口 Point(int a=0, int b=0) { x=a; y=b;} int Getx() {return x;} int Gety() {return y;} int p() {int x=5; cout << x; cout << this->x << endl; } void Setx(int x) { this->x=x; } }; private: // 私有数据 int x, y; ex10_this.cpp 26

指向成员的指针 指向成员指针 : 直接指向类的成员的指针 指向静态成员的指针 对类的静态成员的访问不依赖于对象, 可以通过普通指针来指向和访问静态成员 指向非静态成员的指针类型说明符类名 ::* 指针名 // 指向数据成员类型说明符 ( 类名 ::* 指针名 )( 参数 ) // 指向函数成员 27

指向非静态成员 数据成员指针的赋值与引用 指针名 = & 类名 :: 数据成员名 对象名.* 指针名对象指针名 ->* 指针名 函数成员指针的赋值与引用 指针名 = & 类名 :: 函数成员名 ( 对象名.* 指针名 )( 参数 ) ( 对象指针名 ->* 指针名 )( 参数 ) 28

创建动态对象 类名 * 指针名 =new 类名 () 类名 * 指针名 =new 类名 ( 参数列表 ) // 不带参数 // 带参数 动态对象的释放 delete 指针名 程序结束后, 动态对象也会被释放 29

向量类 vector 向量类, 头文件 vector 向量对象 向量操作 关键字 vector 30

向量类 C++ 提供了向量类, 使用向量与使用数组一样, 但向量的长度可以根据需要自动增减, 比普通数组更灵活 向量的声明 vector< 基本数据类型说明符 > 向量名 例 : #include <vector>...... vector<int> x; // 声明一个整型向量 需要加库文件 vector 可创建不同类型的向量, 这里 x 是对象, 不是普通数组 向量的所有元素都会被初始化 : - 若是基本数据类型, 则全为零 - 若是某个类的对象, 则调用相应构造函数初始化 31

向量类 向量类构造函数 vector<type>(); // 缺省构造函数, 创建一个空向量 vector<type>(int n); // 创建长度为 n 的向量 vector<type>(int n, Type x); // 创建长度为 n 的向量, 并用 x 初始化所有分量 这里的 Type 是基本数据类型, 如 int,float,double 等 例 : vector<int> x(100); // 创建长度为 100 的整型向量 vector<float> y(10, 2.1); // 创建长度为 10 的单精度型向量, 初值都是 2.1 vector<double> z(); // 创建一个双精度型空向量 32

基本操作 向量的基本操作 v[k] 第 k 个分量, 下标从 0 开始 v1 = v2 赋值 ( 复制 ) v1 == v2 个数和值都相等时返回真 v1!= v2 不相等时返回真 <, <=, >, >= 按字典顺序进行比较 33

常用成员函数 at(int k) 返回下标为 k 的分量 size() 返回向量的长度 clear() 清空向量中的数据 empty() 判断向量是否为空 ( 长度为 0) front() 返回第一个分量的值 back() 返回最后一个分量的值 push_back( 数据 ) 在向量末尾插入数据 pop_back() 删除最后一个分量 swap(vector) 交换向量的值 向量名不是地址! 向量是对象 ex10_vector.cpp 关于 vector 的更多介绍参见相关资料 34

字符串类 string 字符串对象与字符数组 string 类的构造函数 字符串各种操作 关键字 string 35

字符串类 字符串 : 可以通过字符数组实现, 也可以通过 string 类实现 C++ 的 string 类提供了处理字符串的各种函数, 使得 C++ 的字符串操作更加方便 使用 string 类必须包含 string 头文件 例 : #include <string> // 注意不是 cstring...... string str; // 定义一个空字符串对象 string str1="math.", str2("ecnu"); // 可以初始化 string str3=str1+str2; // str3="math.ecnu" string str4(5,'c'); // 连续 5 个字符 c 为了以示区别, 后面将由字符数组定义的字符串称为数组字符串

字符串类 string 类构造函数原型 string(); // 默认构造函数 string(const string & s); // 复制构造函数 string(const char * s); // 用字符串常量初始化 string(const string & s, unsigned int p, unsigned int n); // 从位置 p 开始, 取 n 个字符, 即 s[p],.., s[p+n-1] string(const char * s, unsigned int n); // 使用前 n 个字符 string(unsigned int n, char c); // 将给定的字符重复 n 次 37

输入输出 string 对象的输入输出 cin >> str cout << str 输入 getline getline(cin,str) // 以换行符作为输入结束符 getline(cin,str,'c') // 将字符 'c' 作为输入结束符 38

基本操作 操作符示例功能 + = += ==!= < <= > >= [ ] str1 + str2 str1 = str2 str1 += str2 str1 == str2 str1!= str2 str1 < str2 str1 <= str2 str1 > str2 str1 >= str2 str[i] 连接两个字符串用 str2 更新 str1, 即复制 str1 = str1 + str2 比较字符串大小比较字符串大小比较字符串大小比较字符串大小比较字符串大小比较字符串大小访问下标为 i 的字符, 数组方式 以上操作通过操作符重载实现 比较大小按字典顺序, 从前往后逐个进行比较 39

基本操作举例 string str1="hello"; string str2(3,'a'); string str3 = str1 + " Math"; 两个 string 对象可以相加 string 对象和数组字符串也可以相加 但两个数组字符串不能直接相加 string str4="hello" + " Math"; // ERROR string str4="hello" + str2 + " Math"; // OK ex10_string.cpp 40

基本操作举例 string 对象可以直接赋值 但数组字符串不能! string str1; char str2[10]; str1="hello"; // OK str2="hello"; // ERROR 41

更多操作 str[k] 返回第 k 个字符 str.at(k) 返回第 k 个字符 ( 会自动检测是否越界 ) str.length() 字符串对象的长度 ( 字符个数 ) str.size() str.capacity() 同上返回为当前字符串分配的存储空间 str.clear() str.erase(k,n) str.~string() str.empty() 清除字符串中所有内容 从下标 k 开始, 连续清除 n 个字符 释放 string 对象 判断 string 对象是否为空是 (true), 否 (false) 42

更多操作 str.assign(str) str.assign(str[]) 用字符串对象赋值用数组字符串赋值 str.assign(str,k,n) 用 str 从下标 k 开始的连续 n 个字符赋值 str.assign(str,n) str.assign(n,c) 用 str 前 n 个字符赋值用 n 个字符 c 赋值 string str1, str2, str3, str4, str5; str1.assign("hello Math");// OK str2.assign(str1); // OK str3.assign(str1,6,9); // OK str4.assign(str1,5); // OK str5.assign(3,'m'); // str5="mmm" 43

更多操作 str.append(str) 将字符串 str 追加到当前字符串后面 str.append(str,k,n) 追加 str 从下标 k 开始的连续 n 个字符 str.append(str,n) str.append(n,c) 追加 str 的前 n 个字符追加 n 个字符 c string str1, str2; str1="hello "; str2="math"; str1.append(str2,1,3); str1.append(str2,3); str1.append(3,'y'); 44

更多操作 str.substr(str,k,n) str.substr(str,n) 返回当前字符串从下标 k 开始的连续 n 个字符 返回当前字符串从下标 k 开始的子串 str.compare(str) 与 str 比较 ( 大于为正, 等于为 0, 小于为负 ) str.compare(k,n,str) 与 str 的字串 ( 从下标 k 开始的连续 n 个字符 ) 进行比较 str.insert(k,str) str.insert(k,n,c) 在下标 k 位置插入字符串 str 在下标 k 位置连续插入 n 个字符 c str.replace(k,n,str) 用 str 的内容替换从下标 k 开始的 n 个字符 45

更多操作 str.find(str) str.find(str,k) str.find(c) str.find(c,k) 返回 str 在当前字符串中首次出现的位置同上, 从下标 k 位置开始查找返回字符 c 在当前字符串中首次出现的位置同上, 从下标 k 位置开始查找 str.c_str() str.data() 将当前字符串转化为数组字符串 同上 更多成员函数参见 C++ Reference 46

课后练习 课后练习 ( 自己练习 ) 教材第十章 : P. 326 10.2, 10.4 教材第十一章 : P. 375 11.31 P. 378 11.32, 11.33, 11.34 P. 384 11.37, 11.38, 11.39 47

上机作业 注 : 若没有特别说明, 所有数据成员都是 private, 函数成员都是 public 1) 设计一个名为 Rectangle2D 的类, 表示平面坐标下的一个矩形, 这个类包括 : 四个 double 型数据成员 :x, y, width, height, 分别表示矩形中心坐标 宽和高 一个不带形参的构造函数, 用于创建缺省矩形 :(x,y)=(0,0), width=height=1 一个带形参的构造函数 : Rectangle2D(double x, double y, double width, double height) 成员函数 getaera(), 返回矩形面积 成员函数 contains(double x, double y), 当给定点 (x,y) 在矩形内时返回 true, 否则返回 false, 如下页图 a) 成员函数 contains(const Rectangle2D& r), 当给定矩形在当前矩形内是返回 true, 否则返回 false, 如下页图 b) 成员函数 overlaps(const Rectangle2D& r), 当给定矩形与当前矩形有部分重叠时返回 true, 否则返回 false, 如下页图 c) 实现这个类, 并在主函数中测试这个类 : 创建矩形 r1(2,2,5.4,4.8), r2(4,5,10.6,3.3) 和 r3(3,5,2.2,5.5), 输出 r1 的面积, 以及 r1.contains(3,3), r1.contains(r2) 和 r1.overlaps(r3) 的结果 程序取名为 hw10_01.cpp 48

上机作业 a) b) c) 2) 设计一个名为 MyDate 的类, 表示日期, 这个类包括 : 三个 int 型数据成员 :year, month, day, 分别表示年 月 日 一个带一个形参的构造函数, 用给出的自 1970 年 1 月 1 日 0 时流逝的秒数创建一个 MyDate 对象, 如果没有给定时间, 则缺省为当前时间 : MyDate(unsigned long second=time(0)) 一个带三个形参的构造函数, 用给定的年月日创建一个 MyDate 对象 : MyDate(int year, int month, int day) 成员函数 showday( ), 在屏幕上输出对象中的年月日实现这个类, 并在主函数中测试这个类 : 创建表示当前时间的 MyDate 对象 d1 和 d2(3456201512), 然后输出它们所对应的日期 程序取名为 hw10_02.cpp 49

上机作业 3) 设计 Employee 类, 使用 string 对象, 这个类包括 : 四个 string 类数据成员 :name, addr, city, zip, 分别表示姓名, 街道地址, 省市, 邮编 一个带形参的构造函数, 用于初始化数据成员 成员函数 ChangeName, 修改姓名 成员函数 Display, 输出所有信息 ( 即姓名, 地址, 省市和邮编 ) 数据成员是保护类型的, 函数成员是公有类型的实现这个类, 并在主函数中测试这个类 : 使用你自己的相关信息初始化数据成员, 并在屏幕上输出 程序取名为 hw10_03.cpp class Employee { public: Employee(const string&, const string&, cosnt string&, const string&); void ChangeName(string&); void Display(); protected: string name, addr, city, zip; }; 50

上机作业 4) 字符易位破译, 使用字符串类实现 : 编写函数, 测试两个字符串是否字符异位相等, 即两个字符串中包含的字母是相同的, 但次序可以不同, 如 silent 和 listen 是字符异位相等, 但 baac 与 abcc 不是 bool isanagram(const string& str1, const string& str2); void sort(string& str); 提示 : 先对字符串进行排序, 然后再比较 程序取名 hw10_04.cpp 51