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