当前位置: 首页 > news >正文

望城经济建设开区门户网站东莞公司网上推广

望城经济建设开区门户网站,东莞公司网上推广,自己做网站吗,机关网站建设建议概述 我们知道,C的类具有封装和信息隐藏的特性。一般情况下,我们会封装public的成员函数供用户调用,而将成员变量设置为private或protected。但在一些比较复杂的业务情况下,可能需要去访问对象中大量的private或protected成员变量…

概述

        我们知道,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<< (std::ostream &out, const CBase &base);
public:CBase();protected:std::string m_strText;private:int m_nNumber;
};CBase::CBase() : m_strText("CSDN"), m_nNumber(66)
{NULL;
}std::ostream &operator<< (std::ostream &out, const CBase &base)
{// 运算符重载函数作为CBase的友元函数,可访问CBase内的私有成员和受保护成员out << "base dump: " << base.m_strText.c_str() << "," << base.m_nNumber;return out;
}CBase base;
std::cout << base << std::endl;    // 输出为:base dump: CSDN,66

http://www.hotlads.com/news/4692.html

相关文章:

  • 怎么设计logo用什么软件网站优化员seo招聘
  • 移动网站和定制网站哪个推广平台推广最靠谱
  • 做调查问卷用的网站或软件百度快照怎么弄
  • 揭阳网站建设工作网络推广竞价外包
  • 网站建设公司3lue重大新闻事件2023
  • 自己主机做网站服务器吗营销图片素材
  • 360云盘做服务器建设网站太原网站优化
  • 做新年公告图片的网站it学校培训学校哪个好
  • 国外网站翻墙怎么做建立网站需要多少钱
  • 网站检测报告那里做推广普通话主题手抄报
  • 上海展台设计福州百度网站排名优化
  • 温州做网站老师整合营销策划方案模板
  • 佛山微网站推广如何创建自己的网站平台
  • 网站做app的好处数据网站有哪些
  • 绥化网站建设淘宝店铺推广方法
  • 工商局网站建设方案韶山seo快速排名
  • 和人妖做的视频网站百度竞价推广开户费用
  • 数据库和网站开发徐州网站建设方案优化
  • 统计 网站关键字 布局哪有学电脑培训班
  • 晋城网站建设电话株洲网站建设
  • 网站建设漳州windows优化大师win10
  • 汉中公司网站建设晋城seo
  • 做网站设计是什么专业百度平台app下载
  • php建设网站教程线上培训课程
  • 网站后台管理 ftpwindows优化大师是自带的吗
  • 织梦网站地图模板推广普通话宣传内容
  • 连云港权威网站建设价格百度提交入口网址在哪
  • 做交易网站深圳优化排名公司
  • 邢台网站优化站长网站查询工具
  • 网站域名不想实名认证刷关键词要刷大词吗