友元函数、友元类、访问私有数据成员、友元关系[C++]

http://scudong.blogbus.com/logs/46868663.html

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://scudong.blogbus.com/logs/46868663.html

友元函数(friend function)

1. 什么是友元函数?

一个类的私有数据成员通常只能由类的函数成员来访问,而友元函数可以访问类的私有数据成员,也能访问其保护成员

2. 友元函数的用处体现在哪里?

2.1 使用友元函数可提高性能,如:用友元函数重载操作符和生成迭代器类

2.2 用友元函数可以访问两个或多个类的私有数据,较其它方法使人们更容易理解程序的逻辑关系

3. 使用友元函数前应注意:

3.1 类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员

3.2 尽管类定义中有友元函数原型,友元函数仍然不是成员函数

3.3 由于友元函数不是任何类的成员函数,所以不能用句柄(对象)加点操作符来调用

3.4 public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置

3.5 友元关系是指定的,不是获取的,如果让类B成为类A的友元类,类A必须显式声明类B为自己的友元类

3.6 友元关系不满足对称性和传递性

3.7 如果一个友元函数想与两个或更多类成为友元关系,在每个类中都必须声明为友元函数

4. 注:由于C++属于混合语言,常在同一个程序中采用两种函数调用且这两种函数调用往往是相反的。类C语言的调用将

基本数据或对象传递给函数,C++调用则是将函数(或信息)传递给对象

实例1. 友元函数的声明、定义与使用


友元函数、友元类、访问私有数据成员、友元关系[C++]#include<iostream>

友元函数、友元类、访问私有数据成员、友元关系[C++]using namespacestd;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
classCar

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++]friend
voiddisplay(Car);//类"Car"的朋友display() //友元函数的声明

友元函数、友元类、访问私有数据成员、友元关系[C++]
private:

友元函数、友元类、访问私有数据成员、友元关系[C++]
intspeed;

友元函数、友元类、访问私有数据成员、友元关系[C++]
charcolor[20];

友元函数、友元类、访问私有数据成员、友元关系[C++]
public:

友元函数、友元类、访问私有数据成员、友元关系[C++]
voidinput( )

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"Enter the color :";

友元函数、友元类、访问私有数据成员、友元关系[C++] cin
>>color;

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"Enter the speed :";

友元函数、友元类、访问私有数据成员、友元关系[C++] cin
>>speed;

友元函数、友元类、访问私有数据成员、友元关系[C++] }


友元函数、友元类、访问私有数据成员、友元关系[C++]}
;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
voiddisplay(Car x)//友元函数的定义

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"The color of the car is :"<<x.color<<endl;

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"The speed of the car is :"<<x.speed<<endl;

友元函数、友元类、访问私有数据成员、友元关系[C++]}


友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
intmain( )

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] Car mine;

友元函数、友元类、访问私有数据成员、友元关系[C++] mine.input( );
//访问成员函数

友元函数、友元类、访问私有数据成员、友元关系[C++]
display(mine);//友元函数的使用 //将对象"mine"传给友元函数

友元函数、友元类、访问私有数据成员、友元关系[C++]
return0;

友元函数、友元类、访问私有数据成员、友元关系[C++]}
友元函数、友元类、访问私有数据成员、友元关系[C++]


输出结果:

Enter the color: green 回车

Enter the speed: 100 回车

The color of the car is : green

The speed of the car is : 100

实例2. 将一个函数声明为多个类的友元
友元函数、友元类、访问私有数据成员、友元关系[C++]#include<iostream>

友元函数、友元类、访问私有数据成员、友元关系[C++]using namespacestd;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
classVirus;//类'Virus'未定义前要用到,需事先告诉编译器'Virus'是一个类

友元函数、友元类、访问私有数据成员、友元关系[C++]


友元函数、友元类、访问私有数据成员、友元关系[C++]
classBacteria

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++]
private:

友元函数、友元类、访问私有数据成员、友元关系[C++]
intlife;

友元函数、友元类、访问私有数据成员、友元关系[C++]
public:

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++] Bacteria()
{ life=1; }

友元函数、友元类、访问私有数据成员、友元关系[C++]friend
voidCheck(Bacteria, Virus);//类'Bacteria'中,将Check声明为友元函数

友元函数、友元类、访问私有数据成员、友元关系[C++]
}
;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
classVirus

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++]
private:

友元函数、友元类、访问私有数据成员、友元关系[C++]
intlife;

友元函数、友元类、访问私有数据成员、友元关系[C++]
public:

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++] Virus() : life(
0){}

友元函数、友元类、访问私有数据成员、友元关系[C++]friend
voidCheck(Bacteria, Virus);//类'Virus'中,将Check声明为友元函数

友元函数、友元类、访问私有数据成员、友元关系[C++]
}
;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
voidCheck (Bacteria b, Virus v)//友元函数的定义

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++]
if(b.life==1||v.life==1)

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"\nSomething is alive.";

友元函数、友元类、访问私有数据成员、友元关系[C++] }


友元函数、友元类、访问私有数据成员、友元关系[C++]
if(b.life==1)

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"\nA bacteria is alive.";

友元函数、友元类、访问私有数据成员、友元关系[C++] }


友元函数、友元类、访问私有数据成员、友元关系[C++]
if(v.life==1)

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"\nA virus is alive.";

友元函数、友元类、访问私有数据成员、友元关系[C++] }


友元函数、友元类、访问私有数据成员、友元关系[C++]}


友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
intmain()

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] Bacteria fever;

友元函数、友元类、访问私有数据成员、友元关系[C++] Virus cholera;

友元函数、友元类、访问私有数据成员、友元关系[C++] Check(fever, cholera);//友元函数的调用

友元函数、友元类、访问私有数据成员、友元关系[C++]
return0;

友元函数、友元类、访问私有数据成员、友元关系[C++]}



输出结果:

Something is alive.

A bacteria is alive.

友元类(friend class)

1. 友元类可以访问与之为友元关系的类的所有私有成员

2. 友元类使用较少

实例: 友元类


友元函数、友元类、访问私有数据成员、友元关系[C++]#include<iostream>

友元函数、友元类、访问私有数据成员、友元关系[C++]using namespacestd;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
classAdd

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++]
private:

友元函数、友元类、访问私有数据成员、友元关系[C++]
intx,y;

友元函数、友元类、访问私有数据成员、友元关系[C++]
public:

友元函数、友元类、访问私有数据成员、友元关系[C++] Add()

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] x
=y=4;

友元函数、友元类、访问私有数据成员、友元关系[C++] }


友元函数、友元类、访问私有数据成员、友元关系[C++]friend
classSupport;//类'Support'现在是类'Add'的朋友

友元函数、友元类、访问私有数据成员、友元关系[C++]
}
;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
classSupport

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++]
public:

友元函数、友元类、访问私有数据成员、友元关系[C++]
voidSum(Add ob)//此函数可访问类'Add'的所有私有成员

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] cout
<<"The sum of the 2 members is :"<<(ob.x+ob.y)<<endl;

友元函数、友元类、访问私有数据成员、友元关系[C++] }


友元函数、友元类、访问私有数据成员、友元关系[C++]}
;

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]

友元函数、友元类、访问私有数据成员、友元关系[C++]
intmain()

友元函数、友元类、访问私有数据成员、友元关系[C++]友元函数、友元类、访问私有数据成员、友元关系[C++]
{

友元函数、友元类、访问私有数据成员、友元关系[C++] Add ad;

友元函数、友元类、访问私有数据成员、友元关系[C++] Support sup;

友元函数、友元类、访问私有数据成员、友元关系[C++] sup.Sum(ad);

友元函数、友元类、访问私有数据成员、友元关系[C++]
return0;

友元函数、友元类、访问私有数据成员、友元关系[C++]}



输出结果:

The sum of the 2 members is : 8
原文链接: https://www.cnblogs.com/chulia20002001/archive/2010/09/25/1834696.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/15435

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午3:22
下一篇 2023年2月7日 下午3:23

相关推荐