【C++】C++友元
【摘要】 C++中可以使用friend关键字来将函数、类声明为某个类的友元 友元包括友元函数和友元类 友元具有一些特权,可以访问private的成员 友元只能授予,不能索取,单向,不能传递(比如a是b的友元,b是c的友元,但a不是c的友元)
友元函数
在类体中使用friend关键字对友元函数进行声明: 将非成员函数/一般函数声明为友元: friend vo...
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
#ifndef DATA_H
#define DATA_H
class 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
main.cpp
#include<iostream>
#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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
演示结果
源代码下载地址:
GITHUB源码下载地址: 【点我进行下载】
本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。
转载请注明出处:http://chenhaoxiang.cn
本文源自【人生之旅_谙忆的博客】
文章来源: chenhx.blog.csdn.net,作者:谙忆,版权归原作者所有,如需转载,请联系作者。
原文链接:chenhx.blog.csdn.net/article/details/77461049
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)