【C++】C++友元

简介: C++中可以使用friend关键字来将函数、类声明为某个类的友元 友元包括友元函数和友元类 友元具有一些特权,可以访问private的成员 友元只能授予,不能索取,单向,不能传递(比如a是b的友元,b是c的友元,但a不是c的友元) 友元函数在类体中使用friend关键字对友元函数进行声明: 将非成员函数/一般函数声明为友元: friend void func(); //func为非成员函数,不属于任何类 将其他类的成员函数声明为友元: friend void CTime::getNum();//getNum为CTime类的成员。

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

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;
}

演示结果

源代码下载地址:

GITHUB源码下载地址: 点我进行下载

本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn

本文源自人生之旅_谙忆的博客

目录
相关文章
|
5月前
|
程序员 C++
29 C++ - 友元
29 C++ - 友元
27 0
|
1月前
|
安全 编译器 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(一)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
29 1
|
3月前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)
一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit关键字 二、Static成员 ⭕Static成员概念 🔴静态数据成员: 🔴静态函数成员: ⭕使用静态成员的
69 0
|
1天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
8天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
1月前
|
自然语言处理 安全 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(二)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
26 0
|
2月前
|
C++
【c++】友元
【c++】友元
【c++】友元
|
2月前
|
C++
C++类与对象【友元】
C++类与对象【友元】
|
3月前
|
C++
c++类与对象(五):友元、内部类、临时对象、匿名对象
c++类与对象(五):友元、内部类、临时对象、匿名对象
22 0
|
21天前
|
C++
[C++/PTA] 友元很简单2016final
[C++/PTA] 友元很简单2016final
26 0

热门文章

最新文章