c++面向对象程序设计-友元

30 阅读3分钟

6.1 封装的破坏—友元 friend

友元函数

友元提供了不同类的成员函数之间、类的成员函数与普通函数之间进行数据共享的机制;方便编程。

友元类的所有成员函数都成为友元函数。

友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类对象的任何成员

//友元函数一般带有一个与其有好友关系的类类型的入口参数。
friend void Display (Clock &) ;

void Display (Clock &t)              //这是友元普通函数,形参t是Clock类对象的引用
{ cout<<t.hour<<" : "<<t.minute<<" : "<<t.second<<endl; }

image.png

运算符被重载时,需要用到友元函数

如果一个类声明了许多友元,将破坏数据的隐蔽性和类的封装性,降低了程序的可维护性,

一个类的成员函数作为另一个类的友元函数时,必须先定义这个类

image.png

友元类

B类是A类的友元类。友元类B中的所有成员函数都是A类的友元函数,可以访问A类对象中的任何成员。

class B{
	...
};
class A{
	...
	friend B;
	...
};
  1. 友元的声明不受成员访问控制符的限制
  2. 友元关系是单向
  3. 友元关系是不能传递

6.2 对象机制的破坏—静态成员 static

静态成员:实现类的多个对象之间的数据共享

静态成员有两种,一种是静态数据成员,另一种是静态成员函数

静态数据成员

“一个类的所有对象具有相同的属性”,是指属性的个数、名称、数据类型相同

通过静态数据成员来实现“类属性”(描述类的所有对象的共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。)

静态数据成员在内存中只占一份空间。

它是属于类的,但它被该类的所有对象共享,每个对象都可以访问这个静态数据成员。

  1. 静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被访问。

  2. 数据成员是在对象建立时分配空间,在对象撤销时释放。

    静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。

  3. 静态数据成员可以初始化,但只能在类体外进行初始化。(类声明只声明一个类的“尺寸与规格”,并不进行实际的内存分配)

    数据类型类名::静态数据成员名=初值;
    int Student::stu_ count= 0;       //表示对Student类中的静态数据成员初始化
    
  4. 静态数据成员既可以通过对象名访问,也可以通过类名来访问。

image.png

由于s2对象的作用域为复合语句块,当程序执行完此复合语句后调用s2对象的析构函数, stu_ count 的值减1,又变为1,程序输出1。

1 2 1

静态成员函数P199

目的:为了能处理静态数据成员

static int GetCount ()
{ return stu_ count; }

1 . 静态成员函数与非静态成员函数的根本区别是:

非静态成员函数有this指针,而静态成员函数没有this指针,因而决定了静态成员函数不能默认访问本类中的非静态成员。(如果一定要访问本类的非静态成员,应该加对象名和成员运算符”.“)

cout<<age<<endl;    //若age已声明为static,则访问本类中的静态成员,合法
cout<<score<<endl; //若 score是非静态数据成员,不合法

cout<<s.score<<end1;  //合法