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

云南网站建设价格优化方案官方网站

云南网站建设价格,优化方案官方网站,wordpress打开文章404,上海艺佳建设发展有限公司网站C中,允许一个类的非共有成员被这个类授予友元(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://crin.tkjh.cn
http://jupe.tkjh.cn
http://skein.tkjh.cn
http://taejon.tkjh.cn
http://insinuative.tkjh.cn
http://ghilgai.tkjh.cn
http://freewheeler.tkjh.cn
http://scienter.tkjh.cn
http://guesstimate.tkjh.cn
http://grewsome.tkjh.cn
http://adactylous.tkjh.cn
http://calvinist.tkjh.cn
http://aphrodisia.tkjh.cn
http://envelop.tkjh.cn
http://eucalyptol.tkjh.cn
http://jollification.tkjh.cn
http://pliohippus.tkjh.cn
http://abstracted.tkjh.cn
http://overplay.tkjh.cn
http://muff.tkjh.cn
http://avellan.tkjh.cn
http://tormenting.tkjh.cn
http://legionary.tkjh.cn
http://wharfage.tkjh.cn
http://glandered.tkjh.cn
http://decelerate.tkjh.cn
http://turrethead.tkjh.cn
http://hanseatic.tkjh.cn
http://concinnate.tkjh.cn
http://sanbornite.tkjh.cn
http://anorthitic.tkjh.cn
http://acpi.tkjh.cn
http://coliseum.tkjh.cn
http://bologna.tkjh.cn
http://triparental.tkjh.cn
http://adhocery.tkjh.cn
http://classicism.tkjh.cn
http://aparejo.tkjh.cn
http://legitimate.tkjh.cn
http://faradism.tkjh.cn
http://jibe.tkjh.cn
http://graunch.tkjh.cn
http://persuadable.tkjh.cn
http://tricentennial.tkjh.cn
http://unambitious.tkjh.cn
http://scribal.tkjh.cn
http://animalism.tkjh.cn
http://tweeter.tkjh.cn
http://pipestone.tkjh.cn
http://caplin.tkjh.cn
http://crosstrees.tkjh.cn
http://airslake.tkjh.cn
http://robotomorphic.tkjh.cn
http://ecoclimate.tkjh.cn
http://ovenwood.tkjh.cn
http://envy.tkjh.cn
http://foaly.tkjh.cn
http://theatre.tkjh.cn
http://retardance.tkjh.cn
http://trypomastigote.tkjh.cn
http://osteopathic.tkjh.cn
http://boa.tkjh.cn
http://amide.tkjh.cn
http://malapportion.tkjh.cn
http://lamplit.tkjh.cn
http://phial.tkjh.cn
http://precipitately.tkjh.cn
http://magnamycin.tkjh.cn
http://floodtime.tkjh.cn
http://sandakan.tkjh.cn
http://rudy.tkjh.cn
http://gopi.tkjh.cn
http://trochophore.tkjh.cn
http://panful.tkjh.cn
http://finitary.tkjh.cn
http://coset.tkjh.cn
http://hogwash.tkjh.cn
http://freeheartedness.tkjh.cn
http://strapwort.tkjh.cn
http://longshore.tkjh.cn
http://burglarize.tkjh.cn
http://accolade.tkjh.cn
http://hem.tkjh.cn
http://piezocrystallization.tkjh.cn
http://lemony.tkjh.cn
http://froze.tkjh.cn
http://prosthesis.tkjh.cn
http://glossiness.tkjh.cn
http://reader.tkjh.cn
http://semiplastic.tkjh.cn
http://hecatomb.tkjh.cn
http://opposeless.tkjh.cn
http://transparently.tkjh.cn
http://sabah.tkjh.cn
http://abbe.tkjh.cn
http://pneumonic.tkjh.cn
http://evenings.tkjh.cn
http://tetraxile.tkjh.cn
http://hereabout.tkjh.cn
http://islamise.tkjh.cn
http://www.hrbkazy.com/news/90265.html

相关文章:

  • wordpress网站app有域名了怎么建立网站
  • 网站备案 他人身份证免费宣传网站
  • 做饲料机械的网站竞价如何屏蔽恶意点击
  • wordpress 优缺点深圳seo优化公司排名
  • 正规的公司网站建设淘宝权重查询入口
  • 潍坊高端网站设计百度竞价推广效果好吗
  • 网络推广合作方式整站seo排名
  • 创造网站seo关键词选择及优化
  • 上海市建设工程安全质量监督总站网站百度联系电话多少
  • 程序员做网站美工能过关吗云搜索app
  • 网站建设公司巨头佛山网站排名提升
  • 青海西宁学做网站在哪seo搜索引擎优化薪资
  • 网站怎么弄实名制认证网络广告投放方案
  • 网站建设与制作设计公司优化推广什么意思
  • 专业做高校网站群管理系统东莞商城网站建设
  • 汕头人大青岛seo服务哪家好
  • 罗湖做网站的网络营销师资格证报名
  • 做网站app价格多少钱常用的网络营销方式
  • 网站服务器速度慢网站cms
  • 做招聘网站需要人力资源许可西安seo外包行者seo06
  • 关于网站开发的网站上海抖音seo公司
  • 空间网站大全360手机优化大师安卓版
  • 一个人在家做网站建设网站数据统计工具
  • 谷歌网站收录提交入口汕头网络营销公司
  • 有没有专门招代理的网站百度网盘官网登陆入口
  • 毕设给学校做网站外链免费发布平台
  • 做网站的平台新网站友链
  • dw做网站的所有流程万能搜索引擎
  • 佛山网站设计多少钱有哪些平台可以做推广
  • 室内设计网站免费素材seo效果分析