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

长春网站建设公司排名前十如何提高关键词搜索排名

长春网站建设公司排名前十,如何提高关键词搜索排名,微信公众号微网站 建设报价表,wordpress a标签加上nofollowC中,允许一个类的非共有成员被这个类授予友元(friend)关系的全局函数,另一个类,或另一个类中的成员函数访问。友元不是一个类中的成员,所以它们不受声明出现部分的访问权限(public,p…

C++中,允许一个类的非共有成员被这个类授予友元(friend)关系的全局函数另一个类,或另一个类中的成员函数访问。友元不是一个类中的成员,所以它们不受声明出现部分的访问权限(public,protected,private)影响。

友元函数

友元函数是在类中用关键字friend修饰的非成员函数。友元函数可以是一个普通的函数,也可以是其他类的成员函数。虽然它不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。

友元类

友元类是在类中用关键字friend修饰的另一个类的声明。那么这个友元类的所有成员函数都是这个类的友元函数,在友元类的成员函数体内都可以通过对象名访问这个类的私有成员和保护成员。

语法:

全局函数做友元

void spell(){}
class Monster
{   //全局函数做友元friend void spell();
};

类做友元(友元类)

class Skill{};
class Monster
{//友元类friend class Skill;
};

类的成员函数做友元

class Skill
{void spell(){}
};
class Monster
{//类的成员函数做友元friend void Skill::spell();
};

example:全局函数做Monster类的友元

#include <iostream>
using namespace std;enum SKILL_TYPE
{BLOOD = 0
};class Monster;//施法
void spellSkill(Monster &src, Monster &dest, const SKILL_TYPE skillType, const int skillVal);class Monster
{friend void spellSkill(Monster &src, Monster &dest, const SKILL_TYPE skillType, const int skillVal); //全局函数做友元public:Monster():m_monsterId(0), m_name("怪物"), m_blood(0){}Monster(const int monsterId, const string name, const int blood):m_monsterId(monsterId), m_name(name), m_blood(blood){}Monster(const Monster &m):m_monsterId(m.m_monsterId), m_name(m.m_name), m_blood(m.m_blood){}~Monster(){}void spell(Monster &dest){spellSkill(*this, dest, BLOOD, 1000);}private:int m_monsterId; //怪物idstring m_name; //怪物名字int m_blood; //血量
};void spellSkill(Monster &src, Monster &dest, const SKILL_TYPE skillType, const int skillVal)
{switch (skillType){case BLOOD:{int blood = 0;//destdest.m_blood -= skillVal; //因为Skill类是Monster类的友元,所以可以直接访问Monster类的非共有属性if (dest.m_blood < 0)dest.m_blood = 0;//srcsrc.m_blood += skillVal; //因为Skill类是Monster类的友元,所以可以直接访问Monster类的私有成员变量m_blood//因为Skill类是Monster类的友元,所以可以直接访问Monster类的私有成员变量m_namecout << src.m_name << " 攻击了 " << dest.m_name << endl; cout << src.m_name << "的血量增加到:" << src.m_blood << endl;cout << dest.m_name << "的血量减少到 " << dest.m_blood << endl;break;}default:cout << "技能类型未处理:" << skillType << endl;}
}int main(int argc, char *argv[])
{Monster m1(10001, "雪女", 10000);Monster m2(10001, "紫衣仙子", 20000);m1.spell(m2);return 0;
}

example:Skill类做Monster类的友元

#include <iostream>
using namespace std;enum SKILL_TYPE
{BLOOD = 0
};class Monster;class Skill
{public:Skill():m_skillType(BLOOD), m_val(500){}Skill(const int skillType, const int val):m_skillType(skillType), m_val(val){}Skill(const Skill &s):m_skillType(s.m_skillType), m_val(s.m_val){}~Skill(){}//施法void spell(Monster &src, Monster &dest);private:int m_skillType; //技能类型int m_val;
};class Monster
{friend class Skill; //友元类public:Monster():m_monsterId(0), m_name("怪物"), m_blood(0), m_skill(BLOOD, 1000){}Monster(const int monsterId, const string name, const int blood, const int skillType, const int skillVal):m_monsterId(monsterId), m_name(name), m_blood(blood), m_skill(skillType, skillVal){}Monster(const Monster &m):m_monsterId(m.m_monsterId), m_name(m.m_name), m_blood(m.m_blood), m_skill(m.m_skill){}~Monster(){}void spell(Monster &dest){m_skill.spell(*this, dest);}private:int m_monsterId; //怪物idstring m_name; //怪物名字int m_blood; //血量Skill m_skill; //技能
};//施法
void Skill::spell(Monster &src, Monster &dest)
{switch (m_skillType){case BLOOD:{int blood = 0;//destdest.m_blood -= m_val; //因为Skill类是Monster类的友元,所以可以直接访问Monster类的非共有属性if (dest.m_blood < 0)dest.m_blood = 0;//srcsrc.m_blood += m_val; //因为Skill类是Monster类的友元,所以可以直接访问Monster类的私有成员变量m_blood//因为Skill类是Monster类的友元,所以可以直接访问Monster类的私有成员变量m_namecout << src.m_name << " 攻击了 " << dest.m_name << endl; cout << src.m_name << "的血量增加到:" << src.m_blood << endl;cout << dest.m_name << "的血量减少到 " << dest.m_blood << endl;break;}default:cout << "技能类型未处理:" << m_skillType << endl;}
}int main(int argc, char *argv[])
{Monster m1(10001, "雪女", 10000, BLOOD, 1000);Monster m2(10001, "紫衣仙子", 20000, BLOOD, 1000);m1.spell(m2);return 0;
}

example:Skill类的成员函数做Monster类的友元

#include <iostream>
using namespace std;enum SKILL_TYPE
{BLOOD = 0
};class Monster;class Skill
{public:Skill():m_skillType(BLOOD), m_val(500){}Skill(const int skillType, const int val):m_skillType(skillType), m_val(val){}Skill(const Skill &s):m_skillType(s.m_skillType), m_val(s.m_val){}~Skill(){}//施法void spell(Monster &src, Monster &dest);private:int m_skillType; //技能类型int m_val;
};class Monster
{friend void Skill::spell(Monster &src, Monster &dest); //Skill类的成员函数做友元public:Monster():m_monsterId(0), m_name("怪物"), m_blood(0), m_skill(BLOOD, 1000){}Monster(const int monsterId, const string name, const int blood, const int skillType, const int skillVal):m_monsterId(monsterId), m_name(name), m_blood(blood), m_skill(skillType, skillVal){}Monster(const Monster &m):m_monsterId(m.m_monsterId), m_name(m.m_name), m_blood(m.m_blood), m_skill(m.m_skill){}~Monster(){}void spell(Monster &dest){m_skill.spell(*this, dest);}private:int m_monsterId; //怪物idstring m_name; //怪物名字int m_blood; //血量Skill m_skill; //技能
};//施法
void Skill::spell(Monster &src, Monster &dest)
{switch (m_skillType){case BLOOD:{int blood = 0;//destdest.m_blood -= m_val; //因为Skill类是Monster类的友元,所以可以直接访问Monster类的非共有属性if (dest.m_blood < 0)dest.m_blood = 0;//srcsrc.m_blood += m_val; //因为Skill类是Monster类的友元,所以可以直接访问Monster类的私有成员变量m_blood//因为Skill类是Monster类的友元,所以可以直接访问Monster类的私有成员变量m_namecout << src.m_name << " 攻击了 " << dest.m_name << endl; cout << src.m_name << "的血量增加到:" << src.m_blood << endl;cout << dest.m_name << "的血量减少到 " << dest.m_blood << endl;break;}default:cout << "技能类型未处理:" << m_skillType << endl;}
}int main(int argc, char *argv[])
{Monster m1(10001, "雪女", 10000, BLOOD, 1000);Monster m2(10001, "紫衣仙子", 20000, BLOOD, 1000);m1.spell(m2);return 0;
}

为什么要用友元

如果需要在某个全局函数,某一个类或某一个类中的成员函数访问另一个类的私有或保护成员变量,又要求提高代码的执行效率,减少系统开销,我们可以选择让某个全局函数,某一个类或某一个类中的成员函数为另一个类的友元(friend),但这会破坏另一个类的封装性。所以在实际的开发过程中,我们应该按照实际需求选择是否用友元。

友元的特性

  1. 单向性:比如上面的例子中,Skill类是Monster类的友元,但Monster类不是Skill类的友元

  1. 友元不能被继承:比如上面的例子中Skill类是Monster类的友元,假如SceneSkill类是Skill类的子类,SceneSkill类不是Monster类的友元。

  1. 一般情况下,用友元函数重载<<,>>操作符

http://www.hkea.cn/news/970864/

相关文章:

  • 能发外链的网站国际新闻今天最新消息
  • 做软件的网站关键词优化快速排名
  • 网站建设与管理简介网站链接交易
  • 英文网站建设教程网盘资源搜索神器
  • 做旅游网站的引言最新网络推广平台
  • 服务器上给网站做301跳转企业网站注册
  • 网站建设好做吗乐事薯片软文推广
  • wordpress 年月归档如何优化培训体系
  • 威海高区建设局网站长春做网络优化的公司
  • 安平做网站百度一下首页百度一下知道
  • 苏州建设网站市政中标项目如何做推广引流赚钱
  • 17网站一起做网店怎么下单来宾网站seo
  • 建设商务网站的目的天津seo网站排名优化公司
  • 阿里巴巴网站导航栏怎么做口碑营销策划方案
  • 线上做交互的网站百度app下载
  • 做暖暖欧美网站挖掘爱站网
  • 网站 风格百度推广公司
  • 林州网站建设公司站长工具关键词排名怎么查
  • 想给公司做个网站微信seo是什么意思
  • 网站做管制户外刀具营销推广方案模板
  • 淘宝客网站免费做seo网站关键词优化机构
  • 企业做网站建设的好处seo网站关键词优化
  • 一般网站用什么做的最新新闻国内大事件
  • 做线上网站需要钱吗互联网营销推广
  • 找个美工做淘宝网站需要多少钱南昌seo方案
  • 网站用户登录流程图外贸高端网站设计公司
  • 做搜狗手机网站优化软代写
  • wordpress页面背景颜色win7优化设置
  • 做分类信息网站代码百度搜索推广优化师工作内容
  • 南京网站开发公司关键词推广