public 函数_C++:11友元函数、友元类
一、友元(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友元函数、友元类相关推荐
- c++ lambda函数_C++11 之 lambda函数的详细使用
1. lambda 函数概述 lambda 表达式是一种匿名函数,即没有函数名的函数:该匿名函数是由数学中的λ演算而来的.通常情况下,lambda函数的语法定义为: [capture] (parame ...
- mysql 内联函数_C++之内联函数
C++继承C的一个重要特性是效率,在C中保护效率的一个方法是使用宏(macro),宏的实现是使用预处理器而不是编译器,预处理器直接用宏代码替换宏调用,所以就没有了参数压栈.生成汇编语言的CALL.返回 ...
- arg是什么函数_C 语言编程 — 函数
函数 函数的本质就是针对变量的操作过程,同时可能也会改变当前程序的状态.它接受多个输入值,计算并返回一个输出值. 函数大体上分为 3 类: 主函数:每个 C 程序都至少有一个 main(). 内置函数 ...
- 没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数
修改日期:2020/9/6 C++的虚函数 C++的虚函数的特点就是动态绑定,它的意思是动态绑定,在运行的时候,通过引用和指针,可以用基类的类,引用继承该c++类的派生类,虽然指针是基类,但实际上运行 ...
- c语言timer linux 回调函数_C语言回调函数详解
1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...
- c语言strchr函数内容,c strchr函数_c语言strchr函数_strchr函数用法
各位看官们,大家好,上一回中咱们说的是字符串比较的例子,这一回咱们说的例子是:字符串查找.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在C语言的标准库中为我们提供了字符串查找函数,我们 ...
- swap函数_C++ vector成员函数实现[持续更新]
此篇是 配合cppreference-zh-20200816.chm学习 <vector>, <stl_vector.h>和<vector.tcc>源码的笔记 环境 ...
- c++中内敛函数_C++ 内联函数 | 菜鸟教程
内联函数: Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数. 定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用. 优点: 当函数体比较 ...
- java实现c语言的函数_C语言tolower函数介绍、示例和实现
C语言tolower函数用于把大写字母转换为小写字母. 在本文中,我们先来介绍tolower函数的使用方法,然后编写一个自定义的_tolower函数,实现与tolower函数相同的功能. 1.包含头文 ...
- python的fopen函数_C语言fopen函数的用法,C语言打开文件详解
在C语言中,操作文件之前必须先打开文件:所谓"打开文件",就是让程序和文件建立连接的过程. 打开文件之后,程序可以得到文件的相关信息,例如大小.类型.权限.创建者.更新时间等.在后 ...
最新文章
- python好学吗 老程序员-为什么会有程序员不喜欢 Python?
- Linux mount/unmount命令
- 米兔积木机器人能飞吗_米兔积木机器人APP使用教程
- Oracle基础知识-Oracle不同的启动关闭方式
- java基础----递归
- 算法基础:递归算法知识笔记
- 集合附加属性(HACK)
- GridView 批量删除,自定义分页,定位页码
- 人脸识别Demo解析C#
- 初始MySQL数据库
- 37-递归求第五个人的年龄
- 红米手机4A超简单刷入开发版获取ROOT超级权限的教程
- 计算机农业应用答案,东北农业大学计算机应用技术网上作业及答案.doc
- Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.Generi
- 视频教程-最新完整react教程从入门到精通包教包会-ReactJS
- elasticsearch2.1部署
- 如何编写功能测试报告
- K8s系列之:命名空间Namespace
- 类似于快手、美拍、抖音短视频录制SDK接入教程
- Vue 图片上传功能