首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++:11---友元函数、友元类

C++:11---友元函数、友元类

作者头像
网易架构师高司机
发布于 2021-02-03 15:34:54
发布于 2021-02-03 15:34:54
9330
举报
文章被收录于专栏:游戏开发司机游戏开发司机

一、友元(friend)

  • 概念:通过友元,打破了类的封装性,可以访问类内的所有成员
  • 分类:友元函数、友元类

二、友元函数

概念:友元函数是一个普通函数,不属于类,但需要在类内表明友元关系

友元函数可访问类内所有成员,但类不可以访问友元函数内部数据

格式

友元函数可以在类内声明时,需要加上关键字friend

友元函数可以在类外声明,类外定义。需要加上关键字friend

代码语言:javascript
复制
class Cperson
{
private:
int age;
public:
friend void setPersonAge(Cperson& p,int age);
};
void setPersonAge(Cperson& p,int age) //函数在类外声明和定义
{
p.age=age;
}
int main()
{
Cperson person;
setPersonAge(person,18);
}
代码语言:javascript
复制
class Cperson
{
private:
int age;
public:
friend void setPersonAge(Cperson& p,int age)//友元函数在类内定义
{
p.age=age;
}
};


void setPersonAge(Cperson& p,int age);


int main()
{
Cperson person;
setPersonAge(person,18);
}

三、友元类

  • 友元类也不属于类成员,不拥有this指针
  • 一个类A成为另一个类B的友元类时,类A就可以访问类B的所有成员

友元类的形式分为两种

  • 使整个类成为友元
  • 使类中的某一部分函数成为友元

使整个类成为友元

代码语言:javascript
复制
class Cb;//声明类
class Ca
{
private:
int num;
public:
friend class Cb; //使整个类成为Ca的友元,则Cb所有的成员都可以访问Ca的所有成员
};


class Cb
{
public:
void setCaNum(Ca& a);
void Func();
};

使类中的某一部分函数成为友元

代码语言:javascript
复制
class Cb;//声明类
class Ca
{
private:
int num;
public:
friend void Cb::setCaNum(Ca& a);//只有Cb的setCaNum成为Ca的友元
};


class Cb
{
public:
void setCaNum(Ca& a);
void Func();
};

友元关系不可被继承

四、友元特点

  • 单方向性:即友元可访问类,但是类不能访问友元
  • 不传递性:A是B的友元,C是A的友元,但C不是B的友元
  • 不继承:在上面的友元类中有介绍

五、友元的声明和作用域的关系

使用一个友元时,要考虑到其友元的声明和作用域的问题,请看下面代码

代码语言:javascript
复制
class X
{
public:
friend void f(){} //友元函数在类内定义
X() {f();}   //错误,f()函数在下面才声明,此处检测不到
void g();
void h();
};
void X::g(){ return f(); }//错误,此时f()函数还没有被声明
void f(); //声明函数
void X::h(){ return f(); } //正确,检测到f()函数被声明
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、友元(friend)
  • 二、友元函数
    • 格式
  • 三、友元类
    • 使整个类成为友元
    • 使类中的某一部分函数成为友元
  • 四、友元特点
  • 五、友元的声明和作用域的关系
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档