公用数据友元类模板.ppt

上传人:s9****2 文档编号:568248926 上传时间:2024-07-23 格式:PPT 页数:27 大小:349.81KB
返回 下载 相关 举报
公用数据友元类模板.ppt_第1页
第1页 / 共27页
公用数据友元类模板.ppt_第2页
第2页 / 共27页
公用数据友元类模板.ppt_第3页
第3页 / 共27页
公用数据友元类模板.ppt_第4页
第4页 / 共27页
公用数据友元类模板.ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《公用数据友元类模板.ppt》由会员分享,可在线阅读,更多相关《公用数据友元类模板.ppt(27页珍藏版)》请在金锄头文库上搜索。

1、3.4 共用数据的保护共用数据的保护l本节主要内容本节主要内容 3.4.1 常对象常对象 3.4.2 常对象成员常对象成员 3.4.3 指向对象的常指针指向对象的常指针 3.4.4 指向常对象的指针变量指向常对象的指针变量 3.4.5 对象的常引用对象的常引用13.4 共用数据的保护共用数据的保护3.4.1 常对象常对象l作用:作用:定义一个对象时,当其数据成员的值不定义一个对象时,当其数据成员的值不希望被修改时,定义该对象为常对象。希望被修改时,定义该对象为常对象。l与定义常变量类似,必须赋初值。与定义常变量类似,必须赋初值。l定义格式:定义格式: 类名类名 constconst 对象名对象

2、名 (实参列表)(实参列表) 或或 const const 类名类名 对象名对象名 (实参列表)(实参列表) 23.4 共用数据的保护共用数据的保护3.4.1 常对象常对象l常对象常对象不能调用非不能调用非constconst型的成员函数型的成员函数,除系,除系统自动调用的构造函数和析构函数之外。统自动调用的构造函数和析构函数之外。l常对象的所有数据成员的值是不能被修改的。常对象的所有数据成员的值是不能被修改的。l例:例: const time t(10,15,15); 或或 time const t(10,15,15); t.get_time(); /要求必须是常成员函数要求必须是常成员函数

3、33.4 共用数据的保护共用数据的保护3.4.1 常对象常对象l常对象的所有数据成员的值是不能被修改的。常对象的所有数据成员的值是不能被修改的。l编程时出现编程时出现修改常对象数据成员值的需求修改常对象数据成员值的需求,则,则将数据成员声明为将数据成员声明为可变的数据成员可变的数据成员,加,加mutable。l例:例: class mutable int hour; ; const time t(10,15,15); t.get_time(); void time:get_time() hour+=10; 43.6 共用数据的保护共用数据的保护l本节主要内容本节主要内容 3.6.1 常对象常对

4、象 3.6.2 常对象成员常对象成员 3.6.3 指向对象的常指针指向对象的常指针 3.6.4 指向常对象的指针变量指向常对象的指针变量 3.6.5 对象的常引用对象的常引用53.6 共用数据的保护共用数据的保护3.6.2 常对象成员常对象成员(一)常数据成员(一)常数据成员p与定义常变量一样。与定义常变量一样。 int const year; 或或 const int year;p只能通过构造函数的只能通过构造函数的参数初始化表参数初始化表对常数据成对常数据成员进行初始化。员进行初始化。 Date:Date (int y):year(y)p对常数据成员,该类所有对象中的该数据成员对常数据成员

5、,该类所有对象中的该数据成员的的值都是不能改变值都是不能改变的,但的,但不同的对象不同的对象中该数据中该数据成员的值是可以不同的。成员的值是可以不同的。63.6 共用数据的保护共用数据的保护3.6.2 常对象成员常对象成员(二)常成员函数(二)常成员函数l常成员函数只能引用本类中的数据成员,而不常成员函数只能引用本类中的数据成员,而不能修改它们。能修改它们。l注意:注意:声明和定义时都要加声明和定义时都要加constconst关键字关键字。 例:例:void get_time( ) const;l常成员函数引用数据成员情况表常成员函数引用数据成员情况表 (p90)l常对象中的成员函数未加常对象

6、中的成员函数未加constconst声明,编译器声明,编译器默认为非默认为非constconst成员函数。成员函数。73.6 共用数据的保护共用数据的保护l本节主要内容本节主要内容 3.6.1 常对象常对象 3.6.2 常对象成员常对象成员 3.6.3 指向对象的常指针指向对象的常指针 3.6.4 指向常对象的指针变量指向常对象的指针变量 3.6.5 对象的常引用对象的常引用83.6 共用数据的保护共用数据的保护3.6.3 指向对象的常指针指向对象的常指针p指向对象的常指针:指向对象的常指针:将指向对象的指针变量声将指向对象的指针变量声明为明为constconst。p特点:特点:指向不能改变指

7、向不能改变,即声明时,即声明时必须初始化必须初始化。但可以但可以改变指向对象数据成员的值改变指向对象数据成员的值。p一般形式:一般形式: 类名类名 * const 指针变量名指针变量名=&对象名;对象名;例:例:Time t1; Time * const p=&t1;p常用作函数的形参常用作函数的形参,避免在函数的执行过程中,避免在函数的执行过程中改变指针变量的指向。改变指针变量的指向。9P P只能指向只能指向t1t13.4 共用数据的保护共用数据的保护l本节主要内容本节主要内容 3.4.1 常对象常对象 3.4.2 常对象成员常对象成员 3.4.3 指向对象的常指针指向对象的常指针 3.4.

8、4 指向常对象的指针变量指向常对象的指针变量 3.4.5 对象的常引用对象的常引用103.4 共用数据的保护共用数据的保护3.4.4 指向常对象的指针变量指向常对象的指针变量(一)指向常变量的指针变量(一)指向常变量的指针变量p格式:格式: const 类型类型 * 指针指针 或者或者 类型类型 const * 指指针;针;例如:例如:const int a=5; /定义常变量定义常变量 const int *p=&a; /指向一个常变量指向一个常变量p特点:特点:定义后,指针的指向可以改变,但指针定义后,指针的指向可以改变,但指针指向对象的内容(值)不可以改变。指向对象的内容(值)不可以改变

9、。p例:例:1112void main( ) const int a = 78 ; const int b = 25 ; int c = 13 ; const int *pi = &a ; / 只能指向常变量的只能指向常变量的 / *pi = 56 ;*pi = 56 ; / 错误错误, 不能修改所指对象的不能修改所指对象的内容内容 pi = &b ; /可以改变指针的指向可以改变指针的指向 pi = &c ; /可以指向非常变量可以指向非常变量 / *pi = 99 ;*pi = 99 ;/错误错误 c = 99 ; /正确正确 3.4 共用数据的保护共用数据的保护3.4.4 指向常对象的指

10、针变量指向常对象的指针变量(二)指向常对象的指针变量(二)指向常对象的指针变量l常对象,常对象,只能用指向常对象的指针只能用指向常对象的指针指向它。指向它。l指向常对象的指针可以指向一个指向常对象的指针可以指向一个非非常对象。常对象。l如果要改变非常对象数据成员的值如果要改变非常对象数据成员的值可以直接改可以直接改,但但不能通过该指针改变不能通过该指针改变。例:例: Time t1(2,34,54); const Time *p=&t1; t1.hour=15; () (*p).hour=15;()13指向常对象的指针指向常对象的指针非常对象非常对象3.4 共用数据的保护共用数据的保护l本节主

11、要内容本节主要内容 3.4.1 常对象常对象 3.4.2 常对象成员常对象成员 3.4.3 指向对象的常指针指向对象的常指针 3.4.4 指向常对象的指针变量指向常对象的指针变量 3.4.5 对象的常引用对象的常引用143.4 共用数据的保护共用数据的保护3.4.5 对象的常引用对象的常引用(一)变量的常引用(一)变量的常引用p 例:例: int a=24; const int & b=a; a=66; /正确正确 b=89; /错误,常引用不能被更改错误,常引用不能被更改153.5 共用数据的保护共用数据的保护3.4.5 对象的常引用对象的常引用(二)对象的常引用(二)对象的常引用p 例:例

12、: void fun(const Time &t) t.hour=18; () int main() Time t1(10,13,56); fun(t1); coutt1.hourendl; return 0; 16在函数中不能在函数中不能改变改变t t的值的值t1t1的值也不能改变的值也不能改变3.4 共用数据的保护共用数据的保护l小结小结 理解理解常对象常对象、常对象成员的定义和引用方式、常对象成员的定义和引用方式 理解理解指向对象的常指针指向对象的常指针的定义和引用方式的定义和引用方式 了解指向常对象的指针变量的定义和引用方了解指向常对象的指针变量的定义和引用方式式 理解对象的理解对象的

13、常引用常引用的定义和引用方式的定义和引用方式17在一个类中可以有公用的在一个类中可以有公用的(public)成员和私成员和私有的有的(private)成员。在类外可以访问公用成成员。在类外可以访问公用成员,只有本类中的函数可以访问本类的私有员,只有本类中的函数可以访问本类的私有成员。现在,我们来补充介绍一个例外成员。现在,我们来补充介绍一个例外友元友元(friend)。友元可以访问与其有好友关系的类中的私有友元可以访问与其有好友关系的类中的私有成员。成员。友元包括友元函数和友元类友元包括友元函数和友元类。9.10 友元如果在本类以外的其他地方定义了一个函数,如果在本类以外的其他地方定义了一个函

14、数,在类体中用在类体中用friend对其进行声明,此函数就对其进行声明,此函数就称为称为本类的友元函数本类的友元函数。友元函数不属于该类,。友元函数不属于该类,但可以访问该类中的私有成员。但可以访问该类中的私有成员。9.10.1 友元函数1、将普通函数声明为友元函数、将普通函数声明为友元函数2、友元成员函数:、友元成员函数:friend函数是另一个类中的成员函数。函数是另一个类中的成员函数。类的提前引用声明类的提前引用声明3、 一个函数一个函数(包括普通函数和成员函数包括普通函数和成员函数)可以被多个类声明为可以被多个类声明为“朋友朋友”,这样就,这样就可以引用多个类中的私有数据可以引用多个类

15、中的私有数据将一个类将一个类(例如例如B类类)声明为另一个类声明为另一个类(例如例如A类类)的的“朋友朋友”。则友元类。则友元类B中的所有函数都是中的所有函数都是A类的友元函数,可以访问类的友元函数,可以访问A类中的所有成员。类中的所有成员。声明友元类的一般形式为声明友元类的一般形式为friend 类名;类名;如:如:class Afriend B;;9.10.2 友元类说明:说明:(1) 友元的关系是单向的而不是双向的。友元的关系是单向的而不是双向的。(2) 友元的关系不能传递。友元的关系不能传递。在实际工作中,除非确有必要,一般并不把在实际工作中,除非确有必要,一般并不把整个类声明为友元类

16、,而只将确实有需要的整个类声明为友元类,而只将确实有需要的成员函数声明为友元函数,这样更安全一些。成员函数声明为友元函数,这样更安全一些。友元的利弊:友元的利弊: 面向对象程序设计的一个基本原则是封装面向对象程序设计的一个基本原则是封装性和信息隐蔽,而友元却可以访问其他类中性和信息隐蔽,而友元却可以访问其他类中的私有成员,不能不说这是对封装原则的一的私有成员,不能不说这是对封装原则的一个小的破坏。个小的破坏。但是它能有助于数据共享,能提高程序的但是它能有助于数据共享,能提高程序的效率,在使用友元时,要注意到它的副作用,效率,在使用友元时,要注意到它的副作用,不要过多地使用友元,只有在使用它能使

17、程不要过多地使用友元,只有在使用它能使程序精炼,并能大大提高程序的效率时才用友序精炼,并能大大提高程序的效率时才用友元。元。3.8 类模板l函数模板函数模板l一般形式lTemplatel类模板l为什么要有类模板l为什么要使用类模板如果要对功能相同、仅类的数据类型不同的各种情况,都重新定义一种新的类型,会产生较大的重复。例如:class compare_intpublic: compare_int (int a, int b ) x=a; y=b; int max( ) return (xy)? x : y; private: int x,y;class compare_charpublic:

18、compare_char (char a, char b ) x=a; y=b; char max( ) return (xy)? x : y; private: char x,y;void main( ) compare_int c1( 5, 6 ); cout c1.max( ) endl; compare_char c2(a, f); cout c2.max( ) endl;l类模板的定义:为解决这一问题,C+引进类模板的概念。我们在类的声明前先加一行模板关键字。它用一个通用参数 T 来替代不同的数据类型。类模板的定义格式为:template class /类体说明 ;其中templat

19、e 是关键字;中可以有多个参数,其间用逗号分隔。l使用类模板定义对象的:类模板名 对象名( 实参列表 );例如:下面是一个数组类模板的例子#include template class comparepublic: compare (T a, T b ) x=a; y=b; T max( ) return (xy)? x : y; private: T x,y;void main( ) compare cmp1(3,7); coutcmp1.max( )是两个整数中最大的数是两个整数中最大的数endl; compare cmp2(a,g); coutcmp2.max( )是两个字符中最大的字符是两个字符中最大的字符endl; compare cmp3(1.0, 3.0); coutcmp3.max( )是两个浮点数中最大的数是两个浮点数中最大的数endl;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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