友元函数的使用大全 您所在的位置:网站首页 php中public函数 友元函数的使用大全

友元函数的使用大全

2023-03-12 00:02| 来源: 网络整理| 查看: 265

概述

        我们知道,C++的类具有封装和信息隐藏的特性。一般情况下,我们会封装public的成员函数供用户调用,而将成员变量设置为private或protected。但在一些比较复杂的业务情况下,可能需要去访问对象中大量的private或protected成员变量。如果为这些private或protected成员变量都封装public成员函数,无疑是比较麻烦的,有时候还会影响程序的执行效率。此时,友元函数就派上了用场。

        这就好比我们的房间安装了一个指纹锁,陌生人是无法进入房间内部的。但我们的好朋友有时候需要去一下房间,此时,可以把好朋友的指纹也录入指纹锁里面。这样,好朋友就可以顺利进入房间了。

基本规则

        1、一个类的友元可以是函数(称为友元函数),也可以是另一个类(称为友元类)。

        2、要为一个类声明友元时,需要在类声明中友元函数或友元类的前面加上friend关键字。类中友元的位置没有关系,放在public、protected和private均可。

class CBase { friend class CFriend; // 友元类 friend void FriendFunc(CBase &base); // 友元函数 public: CBase(); private: void Show(); protected: std::string m_strText; private: int m_nNumber; }; CBase::CBase() : m_strText("CSDN"), m_nNumber(66) { NULL; } void CBase::Show() { printf("info is: %s, %d\n", m_strText.c_str(), m_nNumber); }

        3、友元函数的原型虽然在类的声明中出现过,但友元函数不是类的成员函数,不能访问类对象的this指针。

CBase base; base.FriendFunc(base); // 友元函数不是类的成员函数,会发生编译错误

        4、友元函数或友元类的定义均在类的外部,但有权访问类的private和protected成员。

void FriendFunc(CBase &base) { base.Show(); // 访问私有成员函数 base.m_strText = "Welcome"; // 访问受保护成员变量 base.m_nNumber = 99; // 访问私有成员变量 }

        5、基类的友元属性不能被派生类继承,就好比你有一个好朋友,但这个好朋友不一定是你儿子和孙子的好朋友。

        6、友元破坏了类的封装性和隐藏性,非必要的情况下,不建议使用,更不能滥用。

全局友元函数

        将全局函数作为类的友元函数,此时,该友元函数可以访问类对象的private或protected成员,也可以访问类的private或protected静态成员。可参看下面的示例代码。

class CBase { friend void FriendFunc(CBase &base); public: CBase(); private: void Show(); protected: std::string m_strText; private: int m_nNumber; static int m_sData; }; int CBase::m_sData = 88; CBase::CBase() : m_strText("CSDN"), m_nNumber(66) { NULL; } void CBase::Show() { printf("info is: %s, %d\n", m_strText.c_str(), m_nNumber); } void FriendFunc(CBase &base) { base.Show(); base.m_strText = "Welcome"; base.m_nNumber = 99; base.Show(); printf("data is: %d\n", CBase::m_sData); } CBase base; FriendFunc(base);

        上述示例代码的输出如下:

info is: CSDN, 66 info is: Welcome, 99 data is: 88

友元类

        将另一个类作为类的友元类,此时,该友元类可以访问类对象的private或protected成员,也可以访问类的private或protected静态成员。可参看下面的示例代码。

class CBase { friend class CFriend; public: CBase(); private: void Show(); protected: std::string m_strText; private: int m_nNumber; static int m_sData; }; int CBase::m_sData = 88; CBase::CBase() : m_strText("CSDN"), m_nNumber(66) { NULL; } void CBase::Show() { printf("info is: %s, %d\n", m_strText.c_str(), m_nNumber); } class CFriend { public: void ShowBase1(const CBase &base); void ShowBase2(); }; void CFriend::ShowBase1(const CBase &base) { printf("friend base1: %s, %d\n", base.m_strText.c_str(), base.m_nNumber); } void CFriend::ShowBase2() { printf("friend base2: %d\n", CBase::m_sData); } CBase base; CFriend fri; fri.ShowBase1(base); fri.ShowBase2();

        上述示例代码的输出如下:

friend base1: CSDN, 66 friend base2: 88

类的成员函数作为友元

        申明友元类时,友元类中的所有函数都可以访问类的private或protected成员。为了限制访问权限,可以只允许类的特定成员函数作为友元函数。可参看下面的示例代码。

class CBase; class CFriend { public: void ShowBase1(const CBase &base); void ShowBase2(); }; class CBase { friend void CFriend::ShowBase1(const CBase &base); public: CBase(); private: void Show(); protected: std::string m_strText; private: int m_nNumber; static int m_sData; }; int CBase::m_sData = 88; CBase::CBase() : m_strText("CSDN"), m_nNumber(66) { NULL; } void CBase::Show() { printf("info is: %s, %d\n", m_strText.c_str(), m_nNumber); } void CFriend::ShowBase1(const CBase &base) { printf("friend base1: %s, %d\n", base.m_strText.c_str(), base.m_nNumber); } void CFriend::ShowBase2() { // 编译出错,因为CFriend::ShowBase2不是CBase的友元,无法访问私有的静态变量 printf("friend base2: %d\n", CBase::m_sData); } CBase base; CFriend fri; fri.ShowBase1(base); fri.ShowBase2();

运算符重载中使用友元

        友元的使用场景,一个是联系紧密、协调工作的类与函数、类与类之间,另一个就是运算符重载。可参看下面的示例代码。

class CBase { friend std::ostream &operator


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有