对象指针和对象引用作函数的参数_Read

上传人:xmg****18 文档编号:117168826 上传时间:2019-11-18 格式:PPT 页数:63 大小:887KB
返回 下载 相关 举报
对象指针和对象引用作函数的参数_Read_第1页
第1页 / 共63页
对象指针和对象引用作函数的参数_Read_第2页
第2页 / 共63页
对象指针和对象引用作函数的参数_Read_第3页
第3页 / 共63页
对象指针和对象引用作函数的参数_Read_第4页
第4页 / 共63页
对象指针和对象引用作函数的参数_Read_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《对象指针和对象引用作函数的参数_Read》由会员分享,可在线阅读,更多相关《对象指针和对象引用作函数的参数_Read(63页珍藏版)》请在金锄头文库上搜索。

1、高等程序设计课程 (C+ Programming Practice) 程序设计实习 运算符重载 2 回顾:类和对象 o 类的定义、成员属性、成员函数、类的作用域 o 对象的创建、存储、访问 o 构造函数、析构函数 n定义、调用时机 o 特殊的构造函数:复制构造函数、转换构造函数、初始 化列表 o 类的特殊成员:static成员、const成员、引用成员 o const对象 o 成员对象和封闭类 o 友元 o this指针 3 课堂问题 1.指出下列各题中的错误,并说明如何改正 nvoid Time(int); nclass Time private: int hour = 12; int mi

2、nute = 0, second = 0; nint Time(int nHour, int nMin, int nSec); 2.以下关于 this 指针的说法中不正确的是: nA. const成员函数内部不可以使用this 指针 B. 成员函数内的this 指针,指向成员函数所作用的对象。 C. 在构造函数内部可以使用this指针 D. 在析构函数内部可以使用 this 指针 构造函数和析构 函数不能有返回 类型; 成员属性不能在 类定义时初始化 const成员函数内部 可以使用this 指针: 是一个const指针, 不能改变this的地址 及所指向的值 4 课堂问题 3.指出下列题中的

3、错误,并说明如何改正 nclass X X (int i, int j): base(i), rem(base % j) int rem, base; 4.如下定义和申明中哪些是错误的,如何改正: n/example.h class Example public: static double rate = 6.5; static const int nSize = 20; static Time Time(12, 0, 0); ; /example.c #include “example.h” double Example:rate; Time Example:Time; Base应在rem之

4、前定 义; 或rem的初始化时不 使用base,直接用i 静态成员变量或成员 对象不能在定义时初 始化,应在.c程序中以 全局变量的方式初始 化; 静态const类型则可以 5 课堂问题 o 以下程序编译、连接都能通过,请写出运行时输出的结 果。你认为没有输出的,就写“无输出“ #include using namespace std; class Sample int A; static int B; public: Sample(int a)A=a,B+=a; static void func(Sample s); ; void Sample:func(Sample s) cout 、y;

5、 void fun(M m1, M *m2); int main() M p(5, 7), q; q.copy( fun(p, p.print(); q.print(); return 0; void fun(M m1, M *m2) m1.setxy(12, 15); m2-setxy(22,25); 输出结果为: 5,7 22,25 38 对象指针和对象引用作函数的参数 o 对象引用作函数参数 n 在实际中,使用对象引用作函数参数要比使用对象 指针作函数更普遍 n 使用对象引用作函数参数具有用对象指针作函数参 数的优点 n 用对象引用作函数参数将更简单,更直接。 #include usin

6、g namespace std; class M public: M() x=y=0; M(int i, int j) x=i; y=j; void copy(M void setxy(int i, int j) x=i; y=j; void print() cout( istream / skip “(” input setw( 4 ) num.areaCode; / input area code input.ignore( 2 ); / skip “)” and space input setw( 4 ) num.exchange; / input exchange input.igno

7、re(); / skip dash “-” input setw( 5 ) num.line; / input line return input; / enables cin a b c; int main() PhoneNumber phone; / create object phone cout (cin, phone); 返回值为引用,使得在 Phonenumber上的对象输入操作 可以串联: cin phone1 phone2; 48 o 注意: n 函数 operator的右操作数 o 总结:流运算符重载 n 对于任何类A,如果希望对它重载流运算符“声明为A 的友员函数 n 重载

8、流运算符“”时,函数 operator” class Screen; class ScreenPtr public: Screen Screen *operator- () return ptr-sp; const Screen const Screen *operator- () const return ptr-sp; private: Screen *ptr; o const版本和非const版本区别:const成员返回const引用 以防止用户改变基础对象 52 重载成员访问操作符 o 成员访问操作符与下标操作符一样,一般应该定义const版本和 非const版本。 o 解引用操作符(

9、*)不要求定义为成员函数。 o 箭头操作符(-) 必须定义为类成员函数,必须返回指向类类型 的指针,或者返回定义了自己的箭头操作符的类类型对象。 n像一个二元操作符:接受一个对象和一个成员名,但事实上它不接受显 式形参。 n例如: Ptr *operator-() return ptr;。这里没有形参,由编译器处理获取 成员的工作。 o 编写程序:ptr-action()时,实际上等价于:(ptr-action)()。而 编译器按如下规则对ptr-action求值: ptr是一个指针,指向具有名为action的成员的类对象,则编译器将代码 编译为调用该对象的action成员。 否则,如果act

10、ion是定义了operator-操作符的类的一个对象,则ptr- action与ptr.operator-()-action相同。即,执行ptr的operator-(),然后 使用该结果重复这三步。 否则代码出错 53 重载+和-运算符 o 自增运算符+、自减运算符-有前置/后置之分 ,为了区分所重载的是前置运算符还是后置运 算符,C+规定 n 前置运算符作为一元运算符重载 p class_a / constructor Date / preincrement operator Date operator+( int ); / postincrement operator private: i

11、nt month; int day; int year; static const int days; / array of days per month void dateIncrement(); / utility function ; const int Date:days=0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; Date return *this; / reference return to create an lvalue /前置形式叫做“增加然后取回值” Date Date:operator+( int ) Date

12、temp = *this; dateIncrement(); / return non-incremented, saved, temporary object return temp; / value return; not a reference return /后置形式叫做“取回然后增加”。 void Date:dateIncrement() Date d4( 3, 18, 1969 ); +d4;/ call d4.operator+() d4+; /call d4.operator+(0) 57 如何选择使用哪种方式重载? o 对于单目运算符(后置“+”、“-”除外) ,通常只需要重

13、 载为成员函数 o 对于双目运算符,如果表达式的左右操作数都相同,也 只要重载为成员函数 o 对于双目运算符op,在许多情况下都希望:对类A进行 重载后,表达式的左操作数可以是A的对象,也可以不 是A的对象 n例如对于字符串类String,重载“+”,合并两个字符串 ps1+ s2 : ps+“abc”: p“abc”+s n同时将函数operator op重载为A的成员函数和友员函数 p支持左操作数为类A的对象 nString operator+(const String n 其中,type表示内置类型名、类类型名或由类型别 名所定义的名字。 n 对任何可作为函数返回类型的类型(void除外

14、)都 可以定义转换函数。 n 一般而言,不允许转换为数组或函数类型,转换为 指针类型(数据和函数指针)以及引用类型是可以 的。 o 转换函数并且形参表必须为空。 o 通常转换操作符应定义为const成员。 61 示例程序 o CMan类 n 运算符重栽 man5:man的身高增长了5厘米 man+8:man的体重增长了8公斤 7+man:man的体重增长了7公斤 n 强制类型转换 quota = (float) man: 把man根据他的体重指数转换 成一个浮点数 o 程序放到网上,课后阅读 62 作业 o 阅读教材 o 邮件作业 n 大整数运算练习:请编写一个用于超长整数处理的 类,使得下列程序能正确运行。假设每个超长整数 最多有100位十进制整数。 知识回顾知识回顾 Knowledge Knowledge ReviewReview

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号