2.19 C++友元函数和友元类
参考: http://www.weixueyuan.net/view/6350.html
总结:
借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属性的title和price成员变量
除了顶层函数可以被定义为友元函数之外,其它类的成员函数同样可以声明为本类的友元函数
- 例3中我们将date类声明为time类的友元类,此时date类中的所有函数都将成为time类的友元函数。
- date类是time类的友元类,但是time类不是date类的友元类。友元关系是单向的,而不是双向的。如果需要将time类也声明名为date类的友元类,则需要另外在date类中声明。
- 友元关系不能传递,假设A类是B类的友元类,B类是C类的友元类,这两点并不能得出A类是C类的友元类。
- 友元类会破坏数据的安全性,使用时宁缺毋滥。如果不是能够极大提高程序运行效率的情况,最好不要用友元。
通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数。
例1:
#include<iostream>
using namespace std; class book
{
public:
book(){}
book(char* a, double p);
friend void display(book &b);
private:
double price;
char * title;
}; book::book(char* a, double p)
{
title = a;
price = p;
} void display(book &b)
{
cout<<"The price of "<<b.title<<" is $"<<b.price<<endl;
} int main()
{
book Alice("Alice in Wonderland",29.9);
display(Alice);
book Harry("Harry potter", 49.9);
display(Harry);
return ;
}
在本例中,display是一个顶层函数,在book类中,我们借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属性的title和price成员变量。这就是友元函数的作用。友元函数可以访问这个类中的私有成员。如果这个display函数不是book类的友元函数,则在函数体中还必须调用public属性的成员函数。在此例中需要注意的是友元函数的形参是类对象的引用,同时在访问私有成员变量时必须要加上对象名。
除了顶层函数可以被定义为友元函数之外,其它类的成员函数同样可以声明为本类的友元函数,如例2所示。
例2:
#include<iostream>
using namespace std; class time; class date
{
public:
date(int y,int m,int d);
void display(time &t);
private:
int year;
int month;
int day;
}; class time
{
public:
time(int s,int m,int h);
friend void date::display(time & t);
private:
int second;
int minute;
int hour;
}; time::time(int s,int m,int h)
{
second = s;
minute = m;
hour = h;
} date::date(int y,int m,int d)
{
year = y;
month = m;
day = d;
} void date::display(time &t)
{
cout<<"The time is:"<<endl;
cout<<year<<"/"<<month<<"/"<<day<<" ";
cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
} int main()
{
date d(,,);
time t(,,);
d.display(t);
return ;
}
在本例中定义了两个类time和date,在time类中有hour、minute和second三个成员变量,分别代表时分秒,在date类中有year、month和day三个成员变量,分别代表年月日信息。为了能够共同显示年月日时分秒信息,我们在date类中声明了一个display函数,并且将该函数设置为time类的友元函数,如此一来,该函数既能访问date类中的私有成员变量,同时又能访问time类中的私有成员变量,打印时间自然不在话下。
这个例子有几点需要注意一下。首先要注意的是date类的定义必须出现在time类之前,这么做是为了使得display函数的函数声明能够在声明为友元函数之前。其次,display函数的形参为time类对象的引用,而time类又必须定义在date类之后,如此一来只能先将time类声明在date类之前了,如class time;这一语句即是为了声明time类。第三点就是需要将display函数的定义放到time类定义的后面,这是因为display函数中必须用到time类中的私有成员变量,因此在使用之前,这些成员变量必须先声明出来。这三个需要注意顺序的地方需要大家特别关注一下,顺序一定不能搞错了,否则都是无法通过编译的。
无论是类的成员函数还是顶层函数,它们都是可以被多个类声明为友元函数的,如此一来就可以访问多个类中的私有成员变量,但是为了保证数据的安全,友元函数的使用宁缺毋滥。
除了可以利用friend关键字声明友元函数之外,我们还可以将其它类声明为当前类的友元类。友元类声明的语法非常简单,即为“friend 类名;”。
例3:
#include<iostream>
using namespace std; class time;
class date
{
public:
date(int y,int m,int d);
void display(time &t);
private:
int year;
int month;
int day;
}; class time
{
public:
friend date;
time(int s,int m,int h);
private:
int second;
int minute;
int hour;
}; time::time(int s,int m,int h)
{
second = s;
minute = m;
hour = h;
} date::date(int y,int m,int d)
{
year = y;
month = m;
day = d;
} void date::display(time &t)
{
cout<<"The time is:"<<endl;
cout<<year<<"/"<<month<<"/"<<day<<" ";
cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
} int main()
{
date d(,,);
time t(,,);
d.display(t);
return ;
}
在本例中,我们将date类声明为time类的友元类,则此时date类中的所有成员函数都将转化为time类的友元函数,可以访问time类中的所有成员。毫无疑问,date类中display函数同样也会成为time类的友元,因此利用time类对象t的引用便可以访问time类的私有成员变量了。此函数中类的声明及定义、函数的声明及定义位置同样需要注意。
关于友元还有几点需要注意:
- 例3中我们将date类声明为time类的友元类,此时date类中的所有函数都将成为time类的友元函数。
- date类是time类的友元类,但是time类不是date类的友元类。友元关系是单向的,而不是双向的。如果需要将time类也声明名为date类的友元类,则需要另外在date类中声明。
- 友元关系不能传递,假设A类是B类的友元类,B类是C类的友元类,这两点并不能得出A类是C类的友元类。
- 友元类会破坏数据的安全性,使用时宁缺毋滥。如果不是能够极大提高程序运行效率的情况,最好不要用友元。
2.19 C++友元函数和友元类的更多相关文章
- C++学习12 友元函数和友元类
友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...
- C++:友元(非成员友元函数、成员友元函数、友元类)
3.8 友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的 ...
- 友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...
- c++友元函数与友元类
友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...
- C++ friend友元函数和友元类(转)
一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...
- C++之友元函数和友元类
通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数. #include<iostream>using namespace std; ...
- C++中的友元函数和友元类
C++中的友元函数主要应用于以下场景: 友元函数 第一种场景 代码中有一个全局函数,该函数想要去访问某个类的成员变量(该类的成员变量是private的,且该类并未提供任何获取获取私有成员变量的publ ...
- 【C++基础 05】友元函数和友元类
友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...
- C++友元函数、友元类
1.什么是友元函数? 友元函数就是可以直接访问类的成员(包括私有数据)的非成员函数,也就是说他并不属于这个类,他是一种外部的函数. 一个外部函数只能通过类的授权成为这个类友元函数,这就涉及到一个关键字 ...
随机推荐
- maven---->配置,指令,插件,使用
maven是用于java的自动化构建工具. 1.下载:http://maven.apache.org/download.cgi 下载下面截图标红处的文件 然后直接解压可以得到文件夹,得到如下文件夹 不 ...
- pip3 install requests Cannot open D:\Python35\Scripts\pip3-script.py
1.问题描述: 使用pip(或pip3)指令安装模块时,出现了Cannot open D:\Python35\Scripts\pip3-script.py的报错信息 2.原因分析: pip安装出错 3 ...
- 20170814xlVBA限定日期按客户分类汇总
原始数据表: 汇总格式: Sub subtotalDic() Dim Wb As Workbook Dim Sht As Worksheet Dim oSht As Worksheet Dim mYe ...
- Elasticsearch SQL
es sql是一个X-pack组件 ,允许对es执行类似sql的查询,可以将Elasticsearch SQL理解为一个编译器,既能理解es,又能理解sql.可以通过利用es,实施大规模实时读取和处理 ...
- php匹配页面中的所有路径
方法一 $url='http://www.google.cn/search?q=php'; $html=file_get_contents($url); $dom = new DOMDocument( ...
- CentOS7 下源代码安装mysql5.6
###### mysql ######### 引言:这里选用mysql5.6版本,5.7版本编译时间需要几个小时. 编译安装环境: yum -y install make gcc-c++ cmake ...
- PGAdmin 4使用笔记
1. import 默认username为postgres psql -U username -h localhost -d databasename -f "file address&qu ...
- spring boot 2.0(一)权威发布spring boot2.0
Spring Boot2.0.0.RELEASE正式发布,在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误,然后Spring ...
- word2013密钥
office 2013是一款功能强大的办公软件目前有两个版本分别为企业版和专业版,是继Microsoft Office 2010 后的新一代套装软件.2012年7月份,微软发布了免费的Office 2 ...
- 函数使用十二:BAPI_MATERIAL_BOM_GROUP_CREATE(CS61)
REPORT ZSM_CREATE_SIMPLEBOM.* This code will create a material BoM for the material* MAINMATERIAL wi ...