友元类

来源:互联网 发布:软件成熟度等级 编辑:程序博客网 时间:2024/06/17 14:05

----------------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】

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 部长的妻子味道中文字幕 中文字幕被水电工掠夺的妻子 妻子在厨房跟水电工 互动 妻子与水电工在线 丈夫出差妻子与水电工 樱萌子被水电工侵犯中文字幕 在丈夫的面前侵犯入侵中文字幕 好妻子在线中文字幕 前田香织侵犯中文字幕 佐佐木明希上司中文字幕迅雷 医生d淫孕妇 公公一晚上要8次 公公现在就想要白关婷中文字幕 丈夫上司侵犯系列在线 义父犯美媳嫁樱花叶菜在线播放 儿子的妻子在线中文字幕云播 老公去世公公每天晚上抱着我睡 被水电工掠夺的妻子在线播放b 佐佐木明希大嫂中文字幕全集 善良的小妻子字幕 公公在我洗碗时在厨房要了我 大嫂被肉翻了天佐佐木明希1 教师蕾丝短裙中文字幕 瓜棚里和大嫂乱禽 强睡大嫂中文字 免费 佐佐木明希 房东中文字幕 与父亲干柴烈火 中文字幕丈夫不在 9大嫂被禽翻中文字幕 侵犯你的贞洁 中文字幕 年轻的妻子在线观中文字幕 大嫂被翻天了佐佐木b希中文7 美丽的大嫂中文字幕影迅雷下载 邻居的妻子中文字幕下载 神马电影院电影中文 神马电影院理论中文 女儿的朋友5中文神马电影院 97手机2019电影院专用版中文 厨房里进入朋友的老婆 中文版电影院 神马电影院 中文