友元函数

转载 2011年01月13日 11:30:00

友元函数(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. 友元函数的声明、定义与使用

#include <iostream>
using namespace std;

class Car
{
    friend 
void display(Car); //类"Car"的朋友display() //友元函数的声明
private:
    
int speed;
    
char color[20];
public:
    
void input( )
    
{
        cout
<<"Enter the color : ";
        cin
>>color;
        cout
<<"Enter the speed : ";
        cin
>>speed;
    }

}
;

void display(Car x) //友元函数的定义
{
    cout
<<"The color of the car is : "<<x.color<<endl;
    cout
<<"The speed of the car is : "<<x.speed<<endl;
}


int main( )
{
    Car mine;
    mine.input( ); 
//访问成员函数
    display(mine); //友元函数的使用 //将对象"mine"传给友元函数
    return 0;
}


输出结果:
Enter the color: green 回车
Enter the speed: 100 回车
The color of the car is : green
The speed of the car is : 100

实例2. 将一个函数声明为多个类的友元

#include <iostream>
using namespace std;

class Virus; //类'Virus'未定义前要用到,需事先告诉编译器'Virus'是一个类

class Bacteria
{
private:
    
int life;
public:
    Bacteria() 
{ life=1; }
friend 
void Check(Bacteria, Virus); //类'Bacteria'中,将Check声明为友元函数
}
;

class Virus
{
private:
    
int life;
public:
    Virus() : life(
0{}
friend 
void Check(Bacteria, Virus); //类'Virus'中,将Check声明为友元函数
}
;

void Check (Bacteria b, Virus v) //友元函数的定义
{
    
if (b.life==1 || v.life==1)
    
{
        cout
<<"/nSomething is alive.";
    }

    
if (b.life==1)
    
{
        cout
<<"/nA bacteria is alive.";
    }

    
if (v.life==1)
    
{
        cout
<<"/nA virus is alive.";
    }

}


int main()
{
    Bacteria fever;
    Virus cholera;
    Check(fever, cholera); //友元函数的调用
    
return 0;
}
 


输出结果:
Something is alive.
A bacteria is alive.

友元类(friend class)
1. 友元类可以访问与之为友元关系的类的所有私有成员
2. 友元类使用较少

实例: 友元类

#include <iostream>
using namespace std;

class Add
{
private:
    
int x,y;
public:
    Add()
    
{
        x
=y=4;
    }

friend 
class Support; //类'Support'现在是类'Add'的朋友
}
;

class Support
{
public:
    
void Sum(Add ob)//此函数可访问类'Add'的所有私有成员
    {
        cout
<<"The sum of the 2 members is : "<<(ob.x+ob.y)<<endl;
    }

}
;


int main()
{
    Add ad;
    Support sup;
    sup.Sum(ad);
    
return 0;
}


输出结果:
The sum of the 2 members is : 8

Open Source离我们有多远

与成功企业的企业文化常被人关注一样,去年以来Linux的成功吸引了许多关注Open Source文化的目光。然而令Open Source文化的倡导者们始料不及的是,在他们为此而欢呼时,不得不面对这样一...
  • terrywang
  • terrywang
  • 2000-12-24 11:23:00
  • 505

c++中友元函数理解与使用。

在学习c++这一块,关于友元函数和友元类,感觉还是不好理解,但是井下心来,理解,需要把我一下几点。 首先讲友元函数。 (1)友元函数: 1)C++中引入友元函数,是为在该类中提供一个对外(除了他...
  • qq_26337701
  • qq_26337701
  • 2017-01-03 17:09:52
  • 9543

C++参考——成员函数、友元函数和一般函数有区别

返回:贺老师课程教学链接【项目4-成员函数、友元函数和一般函数有区别】(1)阅读下面的程序,体会注释中的说明。//例:使用成员函数、友元函数和一般函数的区别 #include using names...
  • sxhelijian
  • sxhelijian
  • 2015-04-07 15:38:08
  • 3403

局部变量和全局变量以及成员变量的区别

@interface Person : NSObject   {       // 成员变量:       // 写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量)    ...
  • panpuqin
  • panpuqin
  • 2017-07-13 20:00:53
  • 4525

c++友元函数声明及其调用

友元函数入门!!!
  • Mr_Ming_
  • Mr_Ming_
  • 2017-09-26 10:59:12
  • 703

c++ 类的使用 友元函数 重载运算符

#ifndef S_H_ #define S_H_ #include "iostream" class s { private: int minutes; int hours; public: ...
  • qq_25235869
  • qq_25235869
  • 2016-03-25 15:53:30
  • 1818

PTA 友元函数操作

C++考试正在进行。请设计一个学生类student,学号、本次考试成绩是其私有数据成员,同时有一个计算本次考试平均成绩的友元函数 double average(student *p,int count...
  • xuptacm
  • xuptacm
  • 2017-06-27 00:12:28
  • 513

3-7 类的友元函数的应用

3-7 类的友元函数的应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description...
  • zhao19961027
  • zhao19961027
  • 2016-09-21 11:45:39
  • 655

C++友元函数以及运算符重载

一、友元函数的作用 函数的私有和保护变量在类内可以访问,在类外只可访问公有变量;派生类在类内只可访问其基类的公有变量和保护变量,在类外只可访问其公有变量(要看具体的继承类型); 因此,在有些情况下...
  • u013089125
  • u013089125
  • 2014-03-29 09:50:00
  • 849

C++_友元函数

1、为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率       具体来说:为了使其他类的成员函数直接访问该类的私有变量       即:允许外面的类或函数去访问类的私有变量和...
  • insistGoGo
  • insistGoGo
  • 2011-07-15 15:17:06
  • 31545
收藏助手
不良信息举报
您举报文章:友元函数
举报原因:
原因补充:

(最多只允许输入30个字)