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

网站建设可行性分析报告/图片识别搜索引擎

网站建设可行性分析报告,图片识别搜索引擎,个人注册公司查询,织梦手机网站如何调用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://www.jmfq.cn/news/5342473.html

相关文章:

  • 怎样免费设计网站建设/各种网站
  • 北京网站建设116net/西安seo优化培训
  • 学院评估+++网站建设整改/深圳seo优化推广公司
  • 安徽网站建设合肥网站建设/北京网站建设制作公司
  • 建设服装网站目的/长尾关键词举例
  • 网站建设 技术支持/友情链接的英文
  • 网站建设做的快/百度一下百度网页官
  • 安徽省外经建设集团有限公司网站/业务网站制作
  • 网站建设美国/百度云网页版登录入口
  • 襄州区住房和城乡建设局网站/网站排名首页
  • 潮州市住房和城乡建设局网站/怎么投稿各大媒体网站
  • 青岛上市公司网站建设/100种找客户的方法
  • 网站YYQQ建设/合肥seo整站优化网站
  • 网站建设和网站编辑是什么工作/百度信息流广告位置
  • 餐饮 公司 网站建设/交换友情链接时需要注意的事项
  • 建设银行卡如何网站激活/竞价排名是什么
  • 千秋网站建设公司/网络营销渠道名词解释
  • 宿迁明远建设有限公司网站/深圳网络营销的公司哪家好
  • 网站建设策划书百度文库/seo数据是什么意思
  • 徐州网站建设优化宣传/个人免费开发网站
  • 网站建设中无码视频/郑州手机网站建设
  • 瓯海建设网站/百度网址大全在哪里找
  • 互联网 现代农业网站建设/网站营销方案
  • 绵阳市建设工程质监站网站/西安网站seo工作室
  • 网站建设外文参考文献/百度seo怎么查排名
  • 梁平城乡建设委员会官方网站/seo建设者
  • 石家庄市住房和建设局网站/elo机制
  • 手机网站建设用乐云seo/有什么软件可以推广
  • 湟源县网站建设/友情链接的网站图片
  • 海南省城乡建设厅网站首页/站长工具服务器查询