友元类

----------------siwuxie095

   

   

   

   

   

   

   

   

   

友元类

   

   

友元类的定义与友元函数的定义非常类似

   

看如下实例:

   

定义一个坐标类:Coordinate

   

   

   

使用方法:使用 friend 关键字跟一个类的类名即可

   

需要注意的是:

   

如果我们声明一个友元类 Circle,需要在 Coordinate 类的前面,先声明

一下 Circle 类,只需写上 class Circle; 即可,这就是告诉计算机,我其实

是有这个类的,在这先用一下,后续再将这个类的主体编译进来

   

这样做才不会造成 friend Circle; 这行代码的错误

   

   

当我们将 Circle 类声明为 Coordinate 类的友元类之后,就可以

在 Circle 类中去定义一个 Coordinate 类的对象,并通过该对象

任意的访问 Coordinate 类中的私有的数据成员和成员函数

   

   

   

当定义 Circle 类时:

   

   

   

Circle 类的 private 下定义了一个 Coordinate 对象,则在 Circle

类的任何成员函数中,都可以通过该对象来访问 Coordinate 类中的

私有数据成员和成员函数

   

   

   

关于友元的注意事项:

   

   

   

1)友元关系不可传递,如:B 是 A 的朋友,C 是 B 的

朋友,那么 C 未必是 A 的朋友

   

2)友元关系的单向性,如:A 是 B 的朋友,B 就不一定

是 A 的朋友,所以在声明友元时,一定要搞清楚到底 A 是

B 的友元,还是 B 是 A 友元

   

3)声明友元时,可以既有友元函数,又有友元类,而且

在声明数量上也是不受限制的

   

   

   

需要特别注意的是:友元只是封装的一种补充,它并不是一种很好

的语法

   

   

   

是不得以而为之,如果在前期设计巧妙的话,实际上是可以避开

使用友元的

   

也就是说,友元的使用破坏了封装性,使得我们的类的封装性看上去

更差,同时也体现了一种定向暴露的思想,即 我把谁当做朋友,就相

当于把数据定向暴露给谁

   

   

   

   

   

程序:

   

Time.h:

   

#ifndef TIME_H

#define TIME_H

   

   

class Match;//注意这里要声明

class Time

{

//声明友元类

friend Match;

public:

Time(int hour, int min, int sec);

private:

void printTime();

int m_iHour;

int m_iMinute;

int m_iSecond;

};

   

#endif // !TIME_H

   

   

   

Time.cpp:

   

#include "Time.h"

#include<iostream>

using namespace std;

   

   

Time::Time(int hour, int min, int sec)

{

m_iHour = hour;

m_iMinute = min;

m_iSecond = sec;

}

   

void Time::printTime()

{

cout << m_iHour << "" << m_iMinute << "" << m_iSecond <<""<< endl;

}

   

   

   

Match.h:

   

#ifndef MATCH_H

#define MATCH_H

   

#include "Time.h"

   

class Match

{

public:

Match(int hour, int min, int sec);

void testTime();

private:

Time m_tTimer;

};

#endif

   

   

   

Match.cpp:

   

#include "Match.h"

#include <iostream>

using namespace std;

   

   

//通过初始化列表将 m_tTimer 进行初始化

// 只要实例化 Match,它当中的 m_tTimer 就会被实例化

//并且所得到的三个参数是通过 Match 的构造函数传入的三个参数得到的

Match::Match(int hour, int min, int sec) :m_tTimer(hour,min,sec)

{

   

}

   

void Match::testTime()

{

m_tTimer.printTime();

cout << m_tTimer.m_iHour << ":" << m_tTimer.m_iMinute << ":" << m_tTimer.m_iSecond << endl;

   

}

   

   

   

main.cpp:

   

#include "stdlib.h"

#include "Match.h"

using namespace std;

   

   

int main(void)

{

Match m(6, 30, 56);

m.testTime();

system("pause");

return 0;

}

   

//友元函数也好 友元类也好 其实都只是封装的补充

//并不是一个很好的语法 是不得已而为之所用的语法

//

//如果在前期设计巧妙 实际上是可以避开使用友元的

//

//友元的使用 破坏了封装性 使得我们的类的封装性看上去更差

//

//同时也体现了一种定向暴露的思想 那么我把谁当作朋友

//就相当于将数据定向的暴露给谁

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

原文地址:https://www.cnblogs.com/siwuxie095/p/6814499.html