友元类

----------------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");

return0;

}

  

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

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

//

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

//

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

//

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

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

  

  

  

  

  

  

  

  

  

【made by siwuxie095】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值