C++ 回忆录 friend

本文探讨了友元类在访问另一个类的私有成员时的作用,通过实例展示了如何在不同类之间实现友元关系,以及如何在类的方法中访问私有成员变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

friend 的出现,是为了让某些类或者方法(包括成员方法或global function)能够访问另外一个类的private 成员变量而诞生.


//class CWindowMgr
void CWindowMgr::echoScreenWH(CScreen sc)
    {
    printf("the screen width=%d and heigth=%d \n",sc.m_width,sc.m_height);  
    }

// class CDisplay

void CDisplay::displayScreen(const CScreen & sc)
    {
    printf("the screen width=%d and heigth=%d \n",sc.m_width,sc.m_height);  
    }
//由于我们要在 CScreen声明这两个类或者CDisplay::displayScreen()中的这个方法,作为CScreen的友元,所以这两个类要先于CScreen的声明.由于我们要在

//CScreen ,CDisplay::displayScreen()中访问CScreen的private member ,所以,他们的定义要后于CScreen的定义,否则都看不到CScreen的变量.

//由于我们把各类的声明放在单独的文件中,所以,这些顺序被编译器处理了. 而对于global 的function ,其实在声明friend的时候就已经是这个function 的声明了,所以我们可以直接

//定义

#include "WindowMgr.h"
#include "Display.h"
class CScreen
    {
    public:
        CScreen(void);
        ~CScreen(void);
     private:
        int m_width;
        int m_height;
    public:
        void setScreenWH(int sw, int sh);

        //friend element
            friend class CWindowMgr;//grand frient to calss CWindowMgr,定义整个类为CScreen的友元,由于友元不是类的成员所以我们没有这样写:

                                                                         //  friend class CWindowMgr m_mgr;

           friend void CDisplay::displayScreen(const CScreen & sc);//grand friend to calss memberfucntion,类中的一个方法做为友元,把那个个类的方法声明copy 过来,

                                                                                                                   //然后前面加上friend 就可以了.

            friend void gdisplayScreen(const CScreen & sc); //global function ,no need to foward declarsion.her is the declarsion

                                                 //全局函数,声明友元的同时就已经是声明了这个函数
    };


//usage


#include "stdafx.h"
#include "Screen.h"

 void gdisplayScreen(const CScreen & sc)
     {
       printf("the screen width=%d and heigth=%d \n",sc.m_width,sc.m_height);  
     }
int _tmain(int argc, _TCHAR* argv[])
{
        CScreen sc;
        CWindowMgr sm;
        CDisplay cd;
        sc.setScreenWH(100,24);
        sm.echoScreenWH(sc);
        cd.displayScreen(sc);
        gdisplayScreen(sc);
        getchar();


    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值