【C++】C++友元

简介: 【C++】C++友元

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源码下载地址: 点我进行下载

目录
相关文章
|
1月前
|
编译器 数据安全/隐私保护 C++
C++(十四) friend友元
友元机制允许非成员函数或类访问私有成员,提高程序效率,但会破坏封装性。友元可以是函数或类,并以关键字`friend`声明。友元函数不是成员函数,需通过对象访问私有成员。友元类使所有成员函数可访问另一个类的私有成员,常用于简化开发。友元声明位置灵活,但不影响访问控制。使用友元需注意其单向性和非传递性。
|
3月前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
73 9
|
3月前
|
编译器 数据安全/隐私保护 C++
C++一分钟之-属性友元与访问控制
【7月更文挑战第9天】C++中的友元机制允许非成员函数或类访问私有和保护成员,打破了封装性。友元需在类内声明,常见的错误包括忘记声明、过度使用及误解友元的非继承性。要避免错误,应明确声明友元,限制其使用,并理解其局限。示例展示了如何声明和使用友元函数来访问私有数据。谨慎使用友元以保持代码的健壮性和可维护性。
23 1
|
3月前
|
编译器 C++
【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
📚 C++ 知识点概览:探索类的`static`成员、友元及应用🔍。
|
3月前
|
编译器 C++
【C++】详解初始化列表,隐式类型转化,类静态成员,友元
【C++】详解初始化列表,隐式类型转化,类静态成员,友元
|
5月前
|
编译器 C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(上)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
34 1
|
5月前
|
C++
C++程序中的友元
C++程序中的友元
24 2
|
5月前
|
编译器 C++
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
27 2