C++关键字 friend
友元是指:
采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元分为友元函数和友元类,两种具有不同的调用形式:
- class Data{
- public:
- ...
- friend int set(int &m);//友元函数
- friend class peop; //友元类
- ...
- }
友元函数:
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);
1.友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
2.一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致。
友元类
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。
例如,以下语句说明类B是类A的友元类:
- class A{
- …
- public:
- friend class B;
- …
- };
经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
(4) 友元函数并不是类的成员函数,因此在类外定义的时候不能加上class::function name
下面我们完整的看一个友元的例子:
- //来自友元——互动百科
- #include
- #include
- class Point//声明
- {
- public:
- Point(double xx, double yy) { x=xx; y=yy; }//默认构造函数
- void Getxy();//公有成员函数
- friend double Distance(Point &a, Point &b);//友元函数
- private:
- double x, y;
- };
- void Point::Getxy()
- {
- cout<<"("<
- }
- double Distance(Point &a, Point &b) //注意函数名前未加类声明符
- {
- double dx = a.x - b.x;
- double dy = a.y - b.y;
- return sqrt(dx*dx+dy*dy);
- }
- void main()
- {
- Point p1(3.0, 4.0), p2(6.0, 8.0);
- p1.Getxy();
- p2.Getxy();
- double d = Distance(p1, p2);
- cout<<"Distance is"<
- }
C++关键字 friend相关推荐
- c语言中external,static关键字用法
static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...
- java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...
一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...
- volatile关键字之全面深度剖析
引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...
- mysql屏蔽关键字实现方法_PHP屏蔽过滤指定关键字的方法
本文实例讲述了PHP屏蔽过滤指定关键字的方法.分享给大家供大家参考.具体分析如下: 实现思路: 一.把关键字专门写在一个文本文件里,每行一个,数量不限,有多少写多少. 二.PHP读取关键字文本,存入一 ...
- Java 静态变量,静态方法,静态常量(java static 关键字)
Java 静态变量,静态方法,静态常量 就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...
- Java this 关键字使用
this 引用就是本类的一个对象 理解这句话看下面一段代码 package me; public class Me {String name; //成员变量int age;public Me(Stri ...
- java 关键字(面试题)
学而时习之,温故而知新. 今天群里有人问java中true ,false 是关键字吗, 这里记录下,不是关键字,我还特意翻看之前的书看看 下面是 Java 语言保留使用的 50 个关键字: 关键字 g ...
- java中标识符,关键字,数据类型
什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...
- iOS面试题整理---关键字!!!
关键字整理 static 1.static全局变量与普通的全局变量有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当 ...
- private关键字和构造方法
1.private: A: 是一个修饰符 B:可以 修饰成员变量,也可以修饰成员方法 C:被private修饰的成员只能在本类中访问 D:针对private修饰的成员变量,可以用getXxx()和se ...
最新文章
- 软件工程(2019)第三次个人作业
- 【PAT甲级 最长公共子串】1007 Maximum Subsequence Sum (25 分) C++ 全部AC
- 将Lucene搜索集成到应用程序中
- mysql不能存字母,使用不常見的字母/符號時,MySql數據庫不能正確存儲數據
- 第45届国际大学生程序设计竞赛(ICPC)沈阳站太原理工大学收获1枚铜牌
- 转 未能使用提供程序 RsaProtectedConfigurationProvider 进行解密 的解决办法
- 基于OpenGL的贪吃蛇游戏设计与实现
- 2021-05-20
- 【Python学习】pandas 删除重复行
- 大数据全样而非抽样原理_一文带你了解什么是大数据
- 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试
- java添加窗体中_java中利用JFrame创建窗体 【转】
- javaSE探赜索隐四<数组>
- Fritzing软件绘制Arduino面包板接线图传感器模块库文件300
- Android应用开发接入讯飞语音合成
- GBase8s数据库REFERENCES 子句
- 把时间当作朋友 读后感
- 修改element-ui中时间选择器的样式
- java/php/net/python高校大学生创新创业管理系统设计
- 简历应该怎么写,HR看一篇简历仅需要5秒吗,简历模板大全
热门文章
- 互联网+ 何人能挡?带着你的Code飞奔吧!
- filestream streamreader
- Java操作Mysql实例
- Sketch2Code 前端智能AI-识别草图生成代码
- 软件开发整理的一些工具
- NLP --- 隐马尔可夫HMM(概念详解、三个基本问题详解)
- 软件开发计划_软件开发的流程是怎么样的?福州IT告诉你:这五点是你需要掌握的...
- Bootstrap 提示工具(Tooltip)弹出框
- 平衡二叉树删除_自平衡二叉树实现及时间复杂度分析
- mobaxterm设置中文界面_如何使用MobaXterm打开WSL2的GUI程序