一、友元(friend) 

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

  • 分类:友元函数、友元类

二、友元函数

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

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

格式

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

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

  • 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);}
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的所有成员

友元类的形式分为两种

  • 使整个类成为友元

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

使整个类成为友元

class Cb;//声明类class Ca{private:int num;public:friend class Cb; //使整个类成为Ca的友元,则Cb所有的成员都可以访问Ca的所有成员};class Cb{public:void setCaNum(Ca& a);void Func();};

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

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的友元

  • 不继承:在上面的友元类中有介绍

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

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

  • 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()函数被声明

public 函数_C++:11友元函数、友元类相关推荐

  1. c++ lambda函数_C++11 之 lambda函数的详细使用

    1. lambda 函数概述 lambda 表达式是一种匿名函数,即没有函数名的函数:该匿名函数是由数学中的λ演算而来的.通常情况下,lambda函数的语法定义为: [capture] (parame ...

  2. mysql 内联函数_C++之内联函数

    C++继承C的一个重要特性是效率,在C中保护效率的一个方法是使用宏(macro),宏的实现是使用预处理器而不是编译器,预处理器直接用宏代码替换宏调用,所以就没有了参数压栈.生成汇编语言的CALL.返回 ...

  3. arg是什么函数_C 语言编程 — 函数

    函数 函数的本质就是针对变量的操作过程,同时可能也会改变当前程序的状态.它接受多个输入值,计算并返回一个输出值. 函数大体上分为 3 类: 主函数:每个 C 程序都至少有一个 main(). 内置函数 ...

  4. 没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数

    修改日期:2020/9/6 C++的虚函数 C++的虚函数的特点就是动态绑定,它的意思是动态绑定,在运行的时候,通过引用和指针,可以用基类的类,引用继承该c++类的派生类,虽然指针是基类,但实际上运行 ...

  5. c语言timer linux 回调函数_C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  6. c语言strchr函数内容,c strchr函数_c语言strchr函数_strchr函数用法

    各位看官们,大家好,上一回中咱们说的是字符串比较的例子,这一回咱们说的例子是:字符串查找.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在C语言的标准库中为我们提供了字符串查找函数,我们 ...

  7. swap函数_C++ vector成员函数实现[持续更新]

    此篇是 配合cppreference-zh-20200816.chm学习 <vector>, <stl_vector.h>和<vector.tcc>源码的笔记 环境 ...

  8. c++中内敛函数_C++ 内联函数 | 菜鸟教程

    内联函数: Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数. 定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用. 优点: 当函数体比较 ...

  9. java实现c语言的函数_C语言tolower函数介绍、示例和实现

    C语言tolower函数用于把大写字母转换为小写字母. 在本文中,我们先来介绍tolower函数的使用方法,然后编写一个自定义的_tolower函数,实现与tolower函数相同的功能. 1.包含头文 ...

  10. python的fopen函数_C语言fopen函数的用法,C语言打开文件详解

    在C语言中,操作文件之前必须先打开文件:所谓"打开文件",就是让程序和文件建立连接的过程. 打开文件之后,程序可以得到文件的相关信息,例如大小.类型.权限.创建者.更新时间等.在后 ...

最新文章

  1. python好学吗 老程序员-为什么会有程序员不喜欢 Python?
  2. Linux mount/unmount命令
  3. 米兔积木机器人能飞吗_米兔积木机器人APP使用教程
  4. Oracle基础知识-Oracle不同的启动关闭方式
  5. java基础----递归
  6. 算法基础:递归算法知识笔记
  7. 集合附加属性(HACK)
  8. GridView 批量删除,自定义分页,定位页码
  9. 人脸识别Demo解析C#
  10. 初始MySQL数据库
  11. 37-递归求第五个人的年龄
  12. 红米手机4A超简单刷入开发版获取ROOT超级权限的教程
  13. 计算机农业应用答案,东北农业大学计算机应用技术网上作业及答案.doc
  14. Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.Generi
  15. 视频教程-最新完整react教程从入门到精通包教包会-ReactJS
  16. elasticsearch2.1部署
  17. 如何编写功能测试报告
  18. K8s系列之:命名空间Namespace
  19. 类似于快手、美拍、抖音短视频录制SDK接入教程
  20. Vue 图片上传功能

热门文章

  1. web开发:css基础
  2. 前端数据修改的两种方式
  3. 336 Palindrome Pairs 回文对
  4. 外网接口(浏览器接口)调取设备数据,放到数据库里
  5. php导出数组到csv格式demo
  6. 配置generatorConfig.xml自动生成的代码的sql书写问题
  7. 两个类似的ViewModel一个可以重写事件,另一个不能重写事件,是哪里出了错。...
  8. stl空间配置器alloc
  9. 深入探索C++对象模型(2)
  10. Oracle 逗号分割的字符串转换为可放入in的语句