C++中友元函数,友元类数详解
C++控制对类对象私有部分的访问,为了适应的编程问题,所以在C++中提供了特定的访问权限:友元。
友元分为3中即:
1:友元函数;
2:友元类:
3:友元成员函数。
一、友元函数
定义:有一类特殊的非成员函数可以访问类的私有成员,它们被称为友元函数:
class Time{
public: friend Time operator *(double m,const Time & t)//需要先在类中定义
}
Time operator *(double m,const Time & t) //定义完后在后面写友元函数,即先定义后写函数
{}
二、友元类
定义:A是B的友元类,A的成员函数可以访问B的私有成员
#include <iostream>
using namespace std;
class Rectangle;//类声明
class Circle;//类声明
void show(Circle &,Rectangle &);//独立函数原型声明class Rectangle{
private:double length;double width;
public:friend void show(Circle &,Rectangle &);//友元函数声明friend class Circle;//友元类声明Rectangle(int l,int w){length=l;width=w;}void show(){cout<<"矩形对象输出:"<<length<<","<<width<<endl;}void showCir(Circle &);//为什么声明和定义要分开写?//因为,函数体中的Circle对象此时不存在,要Circle定义后才有。//所以,定义部分要放在Circle类的定义之后。};class Circle{
private:double radius;
public:friend class Rectangle;//友元类声明friend void show(Circle &,Rectangle &);//友元函数声明(原型声明)Circle(double r){radius=r;}void show(){cout<<"圆对象输出:"<<radius<<endl;}void showRec(Rectangle &r)//想想这个函数的声明和定义为什么不用分开写!!!{cout<<"在圆对象成员函数中访问矩形对象的私有成员:"<<r.length<<","<<r.width<<endl;}
};void Rectangle::showCir(Circle &c)
{cout<<"矩形对象成员函数中访问圆的私有成员:"<<c.radius<<endl;
}
void show(Circle &c,Rectangle &r)
{cout<<"独行函数输出:"<<":"<<c.radius<<","<<r.length<<","<<r.width<<endl;
}void main()
{Circle c(5.0);//定义圆对象Rectangle r(10,20);//定义矩形类对象//要区分下面每个函数调用的意义和功能。c.show();r.show();show(c,r);//独立函数访问Circle,Rectangle类对象的私有成员radius,length,widthc.showRec(r);r.showCir(c);}
总结:
1:友元类之间的关系不能传递,不能继承
2:友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
3:友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
C++中友元函数,友元类数详解相关推荐
- mysql中find_in_set_mysql中find_in_set()函数的使用详解
首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 . 现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那 ...
- java asynchronize_Java 中synchronize函数的实例详解
Java 中synchronize函数的实例详解 java中的一个类的成员函数若用synchronized来修饰,则对应同一个对象,多个线程像调用这个对象的这个同步函数时必须等到上一个线程调用完才能由 ...
- python search用法,Python-re中search()函数的用法详解(查找ip)
1.首先来看一下search()和find()的区别 import re s1 = "2221155" #search 字符串第一次出现的位置 print(re.search(&q ...
- Pandas中read_excel函数参数使用详解+实例代码
目录 前言 一.数据展示 1.io 2.sheet_name 3.header 4.names 5.index_col 6.usecols 7.squeeze 8.dtype 9.engine 10. ...
- python中where的用法_Python中where()函数的用法详解
本文主要和大家介绍了详解Python中where()函数的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参,希望能帮助到大家. where()的用法 首先强调一下,where()函数对于不同的输 ...
- python print函数用法_Python3.2中Print函数用法实例详解
本文实例讲述了Python3.2中Print函数用法.分享给大家供大家参考.具体分析如下: 1. 输出字符串 >>> strHello = 'Hello World' >> ...
- C++中sprintf()函数的使用详解
本篇文章是对C++中sprintf()函数的使用进行了详细的分析介绍,需要的朋友参考下 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf ...
- PHP中spl_autoload_register()函数用法实例详解
在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...
- matlab中的count函数,Excel 中COUNT函数的使用详解,详情介绍
COUNT在英文上是"统计"的意思,在数学上是"计数"的意思.下面,我们来看看Excel中COUNT函数怎么用吧. 操作方法 01 随便输入数字 在Excel中 ...
- opendir php 返回值,php中opendir函数的用法详解
这篇文章主要介绍了php中opendir函数用法,以实例形式详细讲述了opendir函数打开目录的用法及相关的注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例分析了php中opendi ...
最新文章
- [LeetCode 120] - 三角形(Triangle)
- oracle数据库有几个服务_oracle数据库可以有几个数据库
- pcfg 自然语言处理_自然语言处理导航
- html5 can,基于html5 can-vas实现漫天飞雪效果实例
- 洛谷P1288 取数游戏II[博弈论]
- php curl post 下载文件,Curl提交POST请求到一个网址 如何获取返回的文件名
- 根号x_【深情攻X自卑受】糖与盐by根号三
- [转载] Sublime Text 3 插件 ClangFormat 格式化 C/C++版
- 关于强连通图和欧拉图的一些粗浅理解
- 判断当前页面是否在微信浏览器中打开
- 职业规划范文500字计算机专业,技校计算机专业职业生涯规划500字左右
- python语言的运行效率高吗_为什么python运行效率低?原来因为它!
- 抖音直播如何快速提升人气热度,让客户下单。
- ppt助手网络服务器如何设置在哪里,网络服务器配置与管理ppt课件.ppt
- LOJ#2863. 「IOI2018」组合动作 交互
- rsync同步脚本示例,带有exclude参数说明
- 【知识图谱问答】DBpedia介绍
- (附源码)计算机毕业设计SSM驾校预约考试管理系统
- 如何自己制作电子印章?电子印章的制作方法
- CMU AI PhD 第一年总结
热门文章
- 14-项目开发总结报告(GB8567——88)
- 自定义控件---重写Listbox实现item图标变换和item点击事件
- Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性
- 【BO】WEBI文件打开时提示Illegal access错误
- 扩充swap空间的两种方法
- lightbox自定义图片大小的实现
- 查看db2数据库名linux,【名说】DB2数据库备份与恢复(linux环境)
- php抽象类继承抽象类,PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)...
- ctype函数_PHP ctype_xdigit()函数与示例
- Java PipedOutputStream connect()方法与示例