友元类
来源:互联网 发布:软件成熟度等级 编辑:程序博客网 时间: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】
- 友元类
- 友元类
- 友元类
- 友元类
- 友元类
- 友元类
- 友元类
- 友元类
- 友元类...
- 友元类
- 友元类
- 友元类。。。。
- 友元类
- 友元类
- 友元类
- 友元类
- 友元类
- 友元类
- 用CHttpFile实现简单的GET/POST数据
- 转:推荐系统十条经验和教训
- vbs脚本学习整人Demo
- 高仿微信案例整理
- ubuntu查看支持的字体库
- 友元类
- Android实现文字一个一个显示出来
- 什么是 web 语义化?有什么好处?
- 小程序UI与传统HTML5区别
- [JAVA]java.text.NumerFormat的使用问题
- codeforces 804B——Ice cream coloring(图论,dfs,数据结构,好题)
- Strategy模式
- vue中实现图片丶文件上传
- Cypher查询语言--Neo4j中的SQL