公用数据友元类模板.ppt_第1页
公用数据友元类模板.ppt_第2页
公用数据友元类模板.ppt_第3页
公用数据友元类模板.ppt_第4页
公用数据友元类模板.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.4 共用数据的保护,本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用,1,3.4 共用数据的保护,3.4.1 常对象 作用:定义一个对象时,当其数据成员的值不希望被修改时,定义该对象为常对象。 与定义常变量类似,必须赋初值。 定义格式: 类名 const 对象名 (实参列表) 或 const 类名 对象名 (实参列表),2,3.4 共用数据的保护,3.4.1 常对象 常对象不能调用非const型的成员函数,除系统自动调用的构造函数和析构函数之外。 常对象的所有数据成员的值是不能被修改的。 例: const time t(10,15,15); 或 time const t(10,15,15); t.get_time(); /要求必须是常成员函数,3,3.4 共用数据的保护,3.4.1 常对象 常对象的所有数据成员的值是不能被修改的。 编程时出现修改常对象数据成员值的需求,则将数据成员声明为可变的数据成员,加mutable。 例: class mutable int hour; ; const time t(10,15,15); t.get_time(); void time:get_time() hour+=10; ,4,3.6 共用数据的保护,本节主要内容 3.6.1 常对象 3.6.2 常对象成员 3.6.3 指向对象的常指针 3.6.4 指向常对象的指针变量 3.6.5 对象的常引用,5,3.6 共用数据的保护,3.6.2 常对象成员 (一)常数据成员 与定义常变量一样。 int const year; 或 const int year; 只能通过构造函数的参数初始化表对常数据成员进行初始化。 Date:Date (int y):year(y) 对常数据成员,该类所有对象中的该数据成员的值都是不能改变的,但不同的对象中该数据成员的值是可以不同的。,6,3.6 共用数据的保护,3.6.2 常对象成员 (二)常成员函数 常成员函数只能引用本类中的数据成员,而不能修改它们。 注意:声明和定义时都要加const关键字。 例:void get_time( ) const; 常成员函数引用数据成员情况表 (p90) 常对象中的成员函数未加const声明,编译器默认为非const成员函数。,7,3.6 共用数据的保护,本节主要内容 3.6.1 常对象 3.6.2 常对象成员 3.6.3 指向对象的常指针 3.6.4 指向常对象的指针变量 3.6.5 对象的常引用,8,3.6 共用数据的保护,3.6.3 指向对象的常指针 指向对象的常指针:将指向对象的指针变量声明为const。 特点:指向不能改变,即声明时必须初始化。但可以改变指向对象数据成员的值。 一般形式: 类名 * const 指针变量名= 常用作函数的形参,避免在函数的执行过程中改变指针变量的指向。,9,P只能指向t1,3.4 共用数据的保护,本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用,10,3.4 共用数据的保护,3.4.4 指向常对象的指针变量 (一)指向常变量的指针变量 格式: const 类型 * 指针 或者 类型 const * 指针; 例如:const int a=5; /定义常变量 const int *p= /指向一个常变量 特点:定义后,指针的指向可以改变,但指针指向对象的内容(值)不可以改变。 例:,11,12,void main( ) const int a = 78 ; const int b = 25 ; int c = 13 ; const int *pi = /正确 ,3.4 共用数据的保护,3.4.4 指向常对象的指针变量 (二)指向常对象的指针变量 常对象,只能用指向常对象的指针指向它。 指向常对象的指针可以指向一个非常对象。 如果要改变非常对象数据成员的值可以直接改,但不能通过该指针改变。 例: Time t1(2,34,54); const Time *p=(),13,指向常对象的指针,非常对象,3.4 共用数据的保护,本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用,14,3.4 共用数据的保护,3.4.5 对象的常引用 (一)变量的常引用 例: int a=24; const int /错误,常引用不能被更改,15,3.5 共用数据的保护,3.4.5 对象的常引用 (二)对象的常引用 例: void fun(const Time ,16,在函数中不能改变t的值,t1的值也不能改变,3.4 共用数据的保护,小结 理解常对象、常对象成员的定义和引用方式 理解指向对象的常指针的定义和引用方式 了解指向常对象的指针变量的定义和引用方式 理解对象的常引用的定义和引用方式,17,在一个类中可以有公用的(public)成员和私有的(private)成员。在类外可以访问公用成员,只有本类中的函数可以访问本类的私有成员。现在,我们来补充介绍一个例外友元(friend)。 友元可以访问与其有好友关系的类中的私有成员。友元包括友元函数和友元类。,9.10 友元,如果在本类以外的其他地方定义了一个函数,在类体中用friend对其进行声明,此函数就称为本类的友元函数。友元函数不属于该类,但可以访问该类中的私有成员。,9.10.1 友元函数,1、将普通函数声明为友元函数 2、友元成员函数: friend函数是另一个类中的成员函数。 类的提前引用声明 3、 一个函数(包括普通函数和成员函数)可以被多个类声明为“朋友”,这样就可以引用多个类中的私有数据,将一个类(例如B类)声明为另一个类(例如A类)的“朋友”。则友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。 声明友元类的一般形式为 friend 类名; 如:class A friend B; ;,9.10.2 友元类,说明: (1) 友元的关系是单向的而不是双向的。 (2) 友元的关系不能传递。 在实际工作中,除非确有必要,一般并不把整个类声明为友元类,而只将确实有需要的成员函数声明为友元函数,这样更安全一些。,友元的利弊: 面向对象程序设计的一个基本原则是封装性和信息隐蔽,而友元却可以访问其他类中的私有成员,不能不说这是对封装原则的一个小的破坏。 但是它能有助于数据共享,能提高程序的效率,在使用友元时,要注意到它的副作用,不要过多地使用友元,只有在使用它能使程序精炼,并能大大提高程序的效率时才用友元。,3.8 类模板,函数模板 一般形式 Template 类模板 为什么要有类模板,为什么要使用类模板 如果要对功能相同、仅类的数据类型不同的各种情况,都重新定义一种新的类型,会产生较大的重复。例如:,class compare_int public: compare_int (int a, int b ) x=a; y=b; int max( ) return (xy)? x : y; private: int x,y; ; class compare_char public: 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; ,类模板的定义: 为解决这一问题,C+引进类模板的概念。我们在类的声明前先加一行模板关键字。它用一个通用参数 T 来替代不同的数据类型。类模板的定义格式为: template class /类体说明 ; 其中template 是关键字;中可以有多个参数,其间用逗号分隔。 使用类模板定义对象的: 类模板名 对象名( 实参列表 ); 例如:下面是一个数组类模板的例子,#include template class compare public:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论