博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++】C++友元
阅读量:7252 次
发布时间:2019-06-29

本文共 1851 字,大约阅读时间需要 6 分钟。

C++中可以使用friend关键字来将函数、类声明为某个类的友元

友元包括友元函数和友元类
友元具有一些特权,可以访问private的成员
友元只能授予,不能索取,单向,不能传递(比如a是b的友元,b是c的友元,但a不是c的友元)

友元函数

在类体中使用friend关键字对友元函数进行声明:

将非成员函数/一般函数声明为友元:
friend void func(); //func为非成员函数,不属于任何类
将其他类的成员函数声明为友元:
friend void CTime::getNum();//getNum为CTime类的成员。

友元类

在类体中使用friend关键字将某类声明为自己的友元类。

friend CTime;

好处就是方便,可以在其他类或方法直接访问私有成员

缺点:

面向对象的基本原则包括封装性和信息隐藏,而由于友元可以访问其他类的私有成员,这是对封装原则的一个破坏。因此使用友元的时候要特别慎重。

实例

#ifndef TIME_H#define TIME_H #include "Date.h"class CTime{public:    CTime();    CTime(int hour, int minute, int second = 0);    CTime(int value);    CTime(CTime& time);    ~CTime();    void setHour(int hour);    void setMinute(int minute);    void setSecond(int second);    int getHour();    int getMinute();    int getSecond();     int getNum() const;    //friend CDate;//声明友元类,需要声明class CDate;    这样整个类都可以访问CTime的私有成员的了,由于我们只在disPlay函数中访问,所以可以用下面的方法    friend void CDate::disPlay(const CTime& time);    friend void func();//告诉编译器,CTime这个类,已经将func()这个函数声明为自己的友元函数,这个声明可以放在本CTime类中任何地方private:    int m_nHour;    int m_nMinute;    int m_nSecond;    const int m_nNum;};#endif
#ifndef DATA_H#define DATA_Hclass CTime;//类的前置声明,一般情况下,是需要声明之后才可以使用的class CDate{public:    CDate(int year, int month, int day);    //friend CTime;//在这里声明友元没用,因为友元只能授予,不能索取!    void disPlay(const CTime& time);//使用的是类的引用(引用也是使用指针来实现的),这里不声明是可以的private:    int m_nYear;    int m_nMonth;    int m_nDay;};#endif

main.cpp

#include
#include"Time.h" #include "Date.h"using namespace std;void func(){ CTime time(1,1,1); time.m_nHour = 3; cout << time.m_nHour << endl;}int main(){ const CTime time(10,50,20); CTime const time2; std::cout << time.getNum() << std::endl; func(); CDate date(2015, 1, 26); date.disPlay(time); getchar(); return 0;}

演示结果

源代码下载地址:

GITHUB源码下载地址:
【】

本文章由编写, 所有权利保留。

欢迎转载,分享是进步的源泉。

转载请注明出处:

本文源自【】

你可能感兴趣的文章
Web API Request Content多次读取
查看>>
Debian VI高亮显示及注释颜色过灰暗更改办法
查看>>
面对对象基础
查看>>
Spark内存管理
查看>>
boneCP的连接管理
查看>>
关于Generating aspect-oriented Muti-Document Document summarization with event-aspect model
查看>>
KepServerEX读写三菱PLC,车间现场测试记录,带你了解【数据采集的困境】的前世与今生...
查看>>
消息机制
查看>>
使用java写一个简易的tomcat
查看>>
递归三:变态蛙跳台阶
查看>>
JVM 总体结构
查看>>
MySQL 教程分享
查看>>
php使用ffmpeg向视频中添加文字字幕
查看>>
标识符与关键字
查看>>
可视化展示工具-power map
查看>>
体育考试
查看>>
ubuntu搭建mediawiki
查看>>
jQuery给CheckBox全选与不全选
查看>>
uoj#274. 【清华集训2016】温暖会指引我们前行(LCT)
查看>>
[51nod1222] 最小公倍数计数(莫比乌斯反演)
查看>>