第12章 类的其他特性
2021/2/24 1 第12章 类的其他特性
友元函数 为什么要定义友员类中的私有数据不能 被外部任意访问修改,只能由 类本身的函数访问修改。 友员的作用被定义为友员的类或函数 可以访问修改类的私有数据。 友员给予别的类或非成员函数 访问私有成员的权利 2021/224
2021/2/24 2 友元函数 为什么要定义友员 类中的私有数据不能 被外部任意访问修改, 只能由 类本身的函数访问修改。 友员的作用 被定义为友员的类或函数 可以访问修改类的私有数据。 友员给予别的类或非成员函数 访问私有成员的权利
友元函数的说明及使用 什么是友员函数将一个外部函数(不是类全 部,也不是部分成员函数)声明为一个类的友员, 使这个函数能访问类的私有和保护成员。 声明形式 friend返回类型函数名(形参); 例如: friend void show(stn&s 例1:用友元函数的方法求圆柱体的体积。 120112001 2021/224 3
2021/2/24 3 友元函数的说明及使用 例1:用友元函数的方法求圆柱体的体积。 1201 什么是友员函数 将一个外部函数(不是类全 部,也不是部分成员函数)声明为一个类的友员, 使这个函数能访问类的私有和保护成员。 声明形式 friend 返回类型 函数名(形参); 例如: friend void show(st_n &st); 12001
注 1友元函数不是类的成员函数,函数体中要用运算符 “”来访问对象的成员,不能用this指针 区别:友元函数必须在类的定义中说明,函数体 可在类内也可在类外定义;友元函数可访问类中的所 有成员。 2类中对友元函数指定访问权限无效。 3友元函数的作用域与一般函数的作用域相同 4使用友元函数的目的是提高程序的运行效率 5.友元函数破坏了类的封装性,因而应谨慎使用。 2021/224
2021/2/24 4 注: 1.友元函数不是类的成员函数,函数体中要用运算符 “.”来访问对象的成员,不能用this指针。 区别:友元函数必须在类的定义中说明,函数体 可在类内也可在类外定义;友元函数可访问类中的所 有成员。 2.类中对友元函数指定访问权限无效。 3.友元函数的作用域与一般函数的作用域相同。 4.使用友元函数的目的是提高程序的运行效率。 5.友元函数破坏了类的封装性,因而应谨慎使用
成员函数用作友元 什么是友员成员函数将一个类的成员函数(不 是类全部)声明为另一个类的友员,使这个函数 能访问该类的私有和保护成员。 声明形式 friend返回类型类名:函数名 例如: friend void sco:show(); 2021/224 5
2021/2/24 5 成员函数用作友元 什么是友员成员函数 将一个类的成员函数(不 是类全部)声明为另一个类的友员,使这个函数 能访问该类的私有和保护成员。 声明形式 friend 返回类型 类名::函数名 例如: friend void sco::show( );
将类C的一个成员函数说明为类D的友元函数的一般格式: class D;/)类D作引用性说明 class ci 类C的成员定义 public void fun(d &) ∥)能给出函数的原型说明,因类D没有定义 class Di friend void c:fun(D&);∥定义友元函数 void C:: fun( &d) 始定义成员函数 2021/2/24 6
2021/2/24 6 将类C的一个成员函数说明为类D的友元函数的一般格式: class D; //对类D作引用性说明 class C{ … //类C的成员定义 public: void fun(D &); //只能给出函数的原型说明,因类D没有定义 }; class D{ … friend void C::fun(D &); //定义友元函数 }; void C::fun(D &d) //开始定义成员函数 {…}
将一个类M中所有成员说明成另一个类N的友元的一般格式 class Ni ∥)员定义 friend class m 说明类M是类N的友元 class Mi ∥成员定义 类M中的所有成员可使用类N中的全部成员,称类 M为类N的友元。 友元关系不传递, 不具有交换性,也 不具有继承性 2021/224
2021/2/24 7 将一个类M中所有成员说明成另一个类N的友元的一般格式: class N{ … //成员定义 friend class M; //说明类M是类N的友元 }; class M{ … //成员定义 }; 类M中的所有成员可使用类N中的全部成员,称类 M为类N的友元。 友元关系不传递, 不具有交换性,也 不具有继承性
例2:将一个类的成员函数用作另一个类的友元函数。 执行后输出: 1202 al x=25 al. y=40 b1.c=55 b1. d=66 al x=55 al. v=66 例2有关内容总结 1.定义了类A中的函数Sexy()是类B 的友员,建立了类和类的成员函数之 间的联系。使编程显得更便利。 2021/224 8
2021/2/24 8 例2:将一个类的成员函数用作另一个类的友元函数。 执行后输出: 1202 a1.x=25 a1.y=40 b1.c=55 b1.d=66 a1.x=55 a1.y=66 例2 有关内容总结 1. 定义了类A中的函数 Setxy( ) 是类 B 的友员,建立了类和类的成员函数之 间的联系。使编程显得更便利
2.友员成员函数可以访问并修改类的私有 或保护数据,调用类的私有或保护函数 使类不至于由于封装而增加了编程的复 杂性。 总的目标:使外部类的成员函数能访问修改类 的私有或保护数据、能调用类的私有或保护函 数。与友员类的区别是仅将部分成员函数声明 为友员,而不是整个类。 例3:把类作为友元 执行后输出: 1203 x=500y=500 Globalf->var=1000 21/2/24 9
2021/2/24 9 2. 友员成员函数可以访问并修改类的私有 或保护数据,调用类的私有或保护函数 使类不至于由于封装而增加了编程的复 杂性。 总的目标:使外部类的成员函数能访问修改类 的私有或保护数据、能调用类的私有或保护函 数。与友员类的区别是仅将部分成员函数声明 为友员,而不是整个类。 例3:把类作为友元。 执行后输出: 1203 x=500 y=500 GlobalF->var=1000
例3有关内容总结 1.定义了类F2是类F的友员,建立了 类之间的联系。使编程显得更便利 2.友员可以访问并修改类的私有和保护数 据,调用类的私有和保护函数,使类不 至于由于封装而增加了编程的复杂性。 总的目标:使外部类能访问修改类的私有或 保护数据、能调用类的私有或保护函数。 2021/224 10
2021/2/24 10 例3有关内容总结 1. 定义了类 F2是类 F 的友员,建立了 类之间的联系。使编程显得更便利。 2. 友员可以访问并修改类的私有和保护数 据,调用类的私有和保护函数,使类不 至于由于封装而增加了编程的复杂性。 总的目标:使外部类能访问修改类的私有或 保护数据、能调用类的私有或保护函数