友元函数及友元类
友元函数
1.友元函数的简单介绍
1.1为什么要使用友元函数
在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了
使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。
实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。
1.2使用友元函数的优缺点
1.2.1优点:能够提高效率,表达简单、清晰。
1.2.2缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。
2.友元函数的使用
2.1友元函数的参数:
因为友元函数没有this指针,则参数要有三种情况:
2.1.1 要访问非static成员时,需要对象做参数;
2.1.2 要访问static成员或全局变量时,则不需要对象做参数;
2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;
2.2友元函数的位置
因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。
2.3友元函数的调用
可以直接调用友元函数,不需要通过对象或指针
2.4友元函数的分类:
根据这个函数的来源不同,可以分为三种方法:
2.4.1普通函数友元函数
2.4.1.1 目的:使普通函数能够访问类的友元
2.4.1.2 语法:
声明:friend + 普通函数声明
实现位置:可以在类外或类中
实现代码:与普通函数相同
调用:类似普通函数,直接调用
友元函数详解
关于C++中的友元函数的总结
1.友元函数的简单介绍
1.1为什么要使用友元函数
在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了
使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。
实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。
1.2使用友元函数的优缺点
1.2.1优点:能够提高效率,表达简单、清晰。
1.2.2缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。
2.友元函数的使用
2.1友元函数的参数:
因为友元函数没有this指针,则参数要有三种情况:
2.1.1要访问非static成员时,需要对象做参数;
2.1.2要访问static成员或全局变量时,则不需要对象做参数;
2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;
2.2友元函数的位置
因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。
2.3友元函数的调用
可以直接调用友元函数,不需要通过对象或指针
2.4友元函数的分类:
根据这个函数的来源不同,可以分为三种方法:
2.4.1普通函数友元函数
2.4.1.1目的:使普通函数能够访问类的友元
2.4.1.2语法:
声明:friend + 普通函数声明
实现位置:可以在类外或类中
实现代码:与普通函数相同
vb6 friend友元函数
vb6 friend友元函数
友元函数是VB6中一种特殊的函数,它允许一个类中的其他类或模块访问该类的私有成员。在VB6中,我们可以使用Friend关键字来声明友元函数。
友元函数的存在可以提高程序的灵活性和可维护性。它使得不同类之间可以更好地协作,实现更复杂的功能。通过友元函数,我们可以访问私有成员,而不需要将其公开给其他类或模块。
在VB6中,友元函数的声明方式如下:
Friend Function functionName(ByVal parameter1 As DataType, ByVal parameter2 As DataType) As DataType
'函数体
End Function
在这个声明中,关键字Friend表示该函数是一个友元函数。函数名称和参数列表与普通函数的声明方式相同。
友元函数在VB6中的使用也非常简单。只需要在需要访问私有成员的类或模块中调用友元函数即可。由于友元函数的存在,我们不需要修改类的访问权限,就可以实现类之间的数据共享和协作。
友元函数的使用可以帮助我们更好地组织代码,提高代码的可读性和可维护性。它可以减少代码的重复性,提高代码的复用性。同时,
友元函数的使用也可以提高程序的性能,减少不必要的数据传递和转换。
总结一下,友元函数是VB6中一种特殊的函数,它允许一个类中的其他类或模块访问该类的私有成员。它可以提高程序的灵活性和可维护性,使不同类之间可以更好地协作,实现更复杂的功能。友元函数的使用非常简单,只需要在需要访问私有成员的类或模块中调用友元函数即可。友元函数的存在可以帮助我们更好地组织代码,提高代码的可读性和可维护性,减少代码的重复性,提高代码的复用性。
C++友元函数和友元类(C++friend)详解
C++友元函数和友元类(C++friend)详解
私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接⼝(成员函数)间接地进⾏。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的⿇烦。
是从结构化的C语⾔发展⽽来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。
C++ 设计者认为,如果有的程序员真的⾮常怕⿇烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做⼀点妥协以满⾜他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C++ 就有了友元(friend)的概念。打个⽐⽅,这相当于是说:朋友是值得信任的,所以可以对他们公开⼀些⾃⼰的隐私。
友元分为两种:友元函数和友元类。
友元函数
在定义⼀个类的时候,可以把⼀些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。
将全局函数声明为友元的写法如下:
friend 返回值类型函数名(参数表);
将其他类的成员函数声明为友元的写法如下:
friend 返回值类型其他类的类名::成员函数名(参数表);
但是,不能把其他类的私有成员函数声明为友元。
关于友元,看下⾯的程序⽰例。
1. #include<iostream>
2. ug namespace std;
3. class CCar; //提前声明CCar类,以便后⾯的CDriver类使⽤
4. class CDriver
友元函数——精选推荐
友元函数
友元
⽅式:1、全局函数友元(外部);2、成员函数友元;3、类友元。
特点:1、单向;友元不具有传递性、友元不具有继承性。
对象的成员有数据和⽅法,⼀般将数据设置为private或保护,由于类的封闭性和隐藏性;将⽅法设置为public。只有通过对象调动⼀般⽅法来访问其私有成员。
this指针存在于⾮静态成员函数中,则静态成员函数没有this指针,对于静态成员函数既可以在类⾥声明,在类外定义,也可以在类⾥定义。友元函数:
要解决静态成员函数访问其私有成员,则以将static函数前加friend修饰符,变为友元函数。友元函数既可以在类⾥声明,在类外定义,还可以在类⾥定义。
友元函数是在类定义中由关键字friend修饰的⾮成员函数。友元函数不是本类的成员函数,则调⽤时不能通过对象调⽤,直接⽤函数调⽤。
静态成员函数在调⽤时既可以通过对象调⽤,还可以通过函数名直接调⽤。
友元关系:
1、将⼀个⾮成员函数getval()声明为类Test的友元函数,使得该⾮成员函数可以访问类Test的私有成员。
1、截图如下:在类⾥声明友元函数,在类外定义
2、在类⾥声明友元函数,并定义
//先将⾮成员函数在类声明;注意class Test;应在其之前声明,避免编译出错
结果:(两次的结果为)
成员函数友元
3、将⼀个类Test的某成员函数声明为Base类的友元函数,使得可以通过 Test类的这个成员函数访问类Base的私有成员
注意:被屏蔽的代码为编译出错代码,原因是由于Test类中的void getnum(Base &it)的成员函数被未设置为Base类的成员函数友元,则之后访问Base类中的私有成员,则会访问失败。
C 中的FRIEND友元函数
C++中的friend友元函数
(2011-03-2321:01:46)
转载
分类:C
标签:
friend
友元
教育
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率(即减少了类型检查和安全性检查等都需要的时间开销),但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。
#include"cmath"
#include"iostream"
using namespace std;
class Point
友元函数的应用场景
友元函数的应用场景主要包括以下几个方面:
1. 类间关系:当两个或多个类之间需要进行紧密的协作和交互时,可以将一个类中的成员函数声明为另一个类的友元函数,以便直接访问该类的私有成员。
2. 运算符重载:在某些情况下,可能需要重载运算符并操作两个不同对象之间的私有数据。此时可以将相应操作符重载函数声明为两个类的友元。
3. 非成员函数辅助:当我们需要编写一些非类成员的辅助函数来处理类对象时,可以将这些辅助函数声明为该类的友元。
总的来说,友元函数可以减少系统开销,提高效率,使得类与类之间共享数据和功能。
c++ 两个类友元函数
c++ 两个类友元函数
摘要:
1.友元函数的定义
2.友元函数的作用
3.友元函数的实例
4.使用友元函数的注意事项
正文:
C++是一种支持面向对象编程的语言,它允许程序员使用类来描述现实世界中的对象,并且支持类的继承和多态等特性。在C++中,类可以拥有友元函数,这些函数可以访问类的私有成员,从而实现对类的操作。下面我们将详细介绍C++中的友元函数。
1.友元函数的定义
友元函数是一种特殊的函数,它可以访问类的私有成员。友元函数的定义方式是在类中使用关键字“friend”声明一个函数,这个函数可以是类外部的函数,也可以是类的成员函数。例如:
```
class A {
public:
void show() {
cout << "Hello, I am A." << endl;
}
friend void print(A &a) {
cout << "The address of A is: " << &a << endl;
}
};
```
在上面的代码中,我们声明了一个类A,类A 中包含一个公有函数show() 和一个友元函数print()。友元函数print() 可以访问类A 的私有成员。
2.友元函数的作用
友元函数的主要作用是访问类的私有成员。在面向对象编程中,为了保护类的私有成员不被外部访问,我们通常将类的成员声明为私有的。但是,在某些情况下,我们需要让外部函数访问类的私有成员,这时候我们就可以使用友元函数来实现。
3.友元函数的实例
下面是一个使用友元函数的实例:
友元函数不是成员函数
友元函数不是成员函数
在C++中,为了解决一些复杂和非标准的问题,友元函数应运而生,它作为一种特殊的函数,它不是类的成员函数,而是一个独立的一部分,但是能够访问类的私有和保护成员。所以它有一些特别的优点来把多个类之间的复杂问题简单化。在这篇文章中,我们将讨论友元函数与类成员函数的区别,以及友元函数的使用。
首先,友元函数与类成员函数有个明显的区别是它们的定义位置。友元函数可以定义在类体外,而类成员函数必须定义在类体内。另外,友元函数在定义的时候需要指定类名,而类成员函数在定义的时候不用指定类名。这是因为友元函数不属于某个类的成员,而是属于外部的一个独立实体,只能以友元函数的形式,获得类定义的访问权限。
友元函数的主要作用是将类的私有成员和其他类的公有成员连
接起来,使它们之间可以直接交互,实现对类的复杂操作。友元函数也可以用来实现一些只能在类之外实现的操作,而不能在类内部实现的操作。
友元函数也有一定的局限性,它们不能访问类的私有和保护成员,也不能访问类的构造函数或者析构函数。它们也不能访问类的父类的成员,只能访问类本身的成员。
友元函数除了可以使类内外的成员能直接交互外,还可以构建一个全局函数,使函数内部能够使用类内成员。这样可以说友元函数更加适用于类的多态实现。例如,友元函数可以实现多态函数,也就是在一个函数中调用不同类型的对象,而不用额外的参数。
另外,友元函数还可以用在操作符重载中,可以实现对类的复杂操作。例如,可以定义一个友元函数,用来实现对类的+=作,实现一个类的复杂操作,而不用担心类的封装性。
友元函数——精选推荐
友元函数
引⼊友元的原因
类的私有成员只能通过类的成员函数访问,有时候需要在类的外部访问类的私有成员。在不放弃私有成员安全性的情况下,使得⼀个普通函数或者类的成员函数可以访问到封装于某⼀类中的信息。
友元是⼀扇通往私有成员的后门。
友元函数
可以是⾮成员函数,也可以是另⼀个类的成员函数,统称为成员函数。
友元函数不属于当前类的成员函数,⽽是独⽴于当前类的外部函数,但它可以访问该类的所有成员,包括私有成员,保护成员,和公有车成员。
vb6 friend友元函数
vb6 friend友元函数
友元函数是VB6中一个非常重要的概念,它允许一个类中的其他类或模块访问其私有成员。友元函数在编程中起到了很大的作用,它能够提高代码的复用性和灵活性。
在VB6中,我们可以通过在类或模块中声明Friend关键字来定义友元函数。这样,在同一个工程中的其他类或模块就可以直接访问该类或模块中的私有成员。友元函数的作用类似于传统的私有成员,但是它可以被其他类或模块使用。
友元函数可以在许多场景中使用。比如,当一个类需要与其他类或模块进行交互时,可以使用友元函数来访问对方的私有成员。这样可以避免暴露过多的公共接口,提高代码的安全性。
友元函数还可以用于实现一些特殊的功能。比如,在一个面向对象的程序中,我们可能需要在不同的类之间进行数据传递或者共享资源。友元函数提供了一种方便的方式来实现这些功能。通过友元函数,我们可以直接访问其他类或模块中的私有成员,从而实现数据的共享和传递。
当然,友元函数也有一些限制。首先,友元函数只能在同一个工程中的其他类或模块中使用,不能跨工程使用。其次,友元函数只能访问其他类或模块中的私有成员,不能访问公共成员或受保护的成员。最后,友元函数只能在声明它的类或模块中使用,不能被其他
类或模块声明为友元函数。
友元函数是VB6中一个非常实用的功能,它可以提高代码的复用性和灵活性。通过友元函数,我们可以方便地访问其他类或模块中的私有成员,实现数据的共享和传递。在编程中,合理地使用友元函数可以提高代码的可维护性和可扩展性,是一个非常值得推荐的编程技巧。
C语言中friend友元函数详细解析
C语言中friend友元函数详细解析
C语言中friend友元函数详细解析
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。
我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率(即减少了类型检查和安全性检查等都需要的时间开销),但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。
复制代码代码如下:
#include "cmath"
#include "iostream"
using namespace std;
class Point
vb6 friend友元函数
vb6 friend友元函数
Friend函数是VB6中的一个特殊关键字,用于在模块或类之间共享变量和方法。它允许一个模块或类将其变量或方法声明为“友元”,以便其他模块或类可以访问它们。
Friend友元函数的使用使得程序的设计更加灵活和模块化。它可以使不同的模块或类之间更好地协作,共享信息和功能。通过友元函数,我们可以实现更高效的代码重用和维护。
在VB6中,可以使用Friend关键字来声明友元函数。例如,我们可以在一个类中声明一个Friend函数,然后在另一个类中通过该函数访问该类的私有成员。
Friend函数的使用可以提高代码的可读性和可维护性。它可以使程序员更容易理解和修改代码,因为它们可以直接访问其他模块或类的私有成员,而不需要通过复杂的接口或公共方法。
Friend函数也可以用于模块之间的信息交换。例如,我们可以在一个模块中声明一个Friend函数,该函数可以访问另一个模块中的变量,并将其值传递给其他模块。
总的来说,Friend友元函数在VB6中是一个非常有用的特性。它可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。通过友元函数,不同的模块和类可以更好地协作,共享信息和功能,从而实现更高效的代码重用和维护。在VB6中,友元函数是一个非
常强大和灵活的工具,值得我们充分利用。
C++总结 友元类和友元函数
C++总结友元类和友元函数
《windows环境多线程编程原理与应用》中解释:如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得到允许的类或函数允许通过这个门访问一般的类或者函数无法访问的私有属性和方法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。友元类的说明将外界的某个类在本类别的定义中说明为友元,那么外界的类就成为本类的“朋友”,那个类就可以访问本类的私有数据了。
class Merchant
{
private :
intm_MyMoney;
intm_MyRoom;
… …
public:
Friend class Lawyer;
Intgetmoney();
… …
};
class Lawyer
{
private:
… …
public:
… …
};
只有你赋予某个类为你的友元时,那个类才有访问你的私有数据的权利。
说明一个函数为一个类的友元函数则该函数可以访问此类的私有数据和方法。定义方法是在类的定义中,在函数名前加上关键字friend.
《挑战30天C/C++》这样解释:
在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:
通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但所矛盾的是,即使是最大限度大保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。在类里声明一个普通数学,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。
友元成员函数
友元成员函数
C++言是一种面向对象的编程语言,它为程序员提供了一系列强大的特性和功能。友元成员函数是C++中一种重要的概念,它可以让对象访问其他对象的私有成员。友元成员函数的实现机制可以帮助程序员有效的处理一些私有成员的访问问题。
所谓的友元成员函数,即不是成员函数,也不是非成员函数,而是一种特殊的函数,它既不属于某一个类的成员函数,也不属于非成员函数,而是属于友元函数。友元函数可以访问对象的私有成员,它可以用来访问两个类之间的成员,因此它是一种函数特性,它可以用来访问受保护成员和私有成员。
友元成员函数的语法格式有以下几类形式:
(1)声明友元函数:
类名::friend数名(参数列表);
(2)声明友元类:
friend class名;
(3)重载运算符:
friend名 operator算符(参数列表);
在实际应用中,友元成员函数可以帮助程序员有效的处理私有成员的访问问题,并保护私有成员不受外界影响。除此之外,友元成员函数还可以提高代码的可读性,将复杂性隐藏起来,从而使代码更简洁,更易于管理。
不过,在使用友元成员函数时,程序员也需要特别注意。首先,
友元函数的声明和定义必须位于友元函数的作用域内,并且需要注意友元函数的参数定义。其次,友元函数不能访问类的私有成员,也不能调用类的构造函数。最后,友元函数不能改变类的私有成员的值,只能读取其值。此外,友元函数也不能修改类的静态变量。
使用友元成员函数既可以拓展类的功能,也可以提高类的可读性。但是,程序员在使用友元成员函数时,需要特别注意以上几点,同时也要谨慎使用,以避免程序出现不可预料的错误。
定义友元函数
定义友元函数
友元函数是指可以访问类的私有成员变量的函数,它不属于类的成员函数,但却与类有一定的关系,可以在类中声明为友元函数。友元函数的定义如下:
```c++
class A {
private:
int x;
public:
friend int func(A obj); // 声明友元函数
};
int func(A obj) {
return obj.x; // 访问类的私有成员变量
}
```
在上述代码中,我们定义了一个类 `A`,并声明了一个友元函数`func`,该函数可以访问类 `A` 的私有成员变量 `x`。在实际使用中,我们可以通过以下方式调用友元函数:
```c++
A obj;
int result = func(obj);
```
需要注意的是,友元函数不会继承,因此在派生类中需要重新声明。同时,友元函数不能访问类的静态成员变量,需要另外定义静态函数成为友元函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
友元函数及友元类
已有 20621 次阅读 2009-5-9 15:43 |个人分类:C/C++
什么是友元(friend)?
允许另一个类或函数访问你的类的东西。
友元可以是函数或者是其他的类。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。
分清成员函数,非成员函数和友元函数
成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定,就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。
Ø类的主要特点之一是数据隐藏,即类的私有成员只能在类定义的范围内使用,也就是说私有成员只能通过它的成员函数来访问。
Ø但是,有时候需要在类的外部访问类的私有成员。为此,就需要寻找一种途径,在不放弃私有数据安全性的情况下,使得类外部的函数或类能够访问类中的私有成员,在C++中就用友元作为实现这个要求的辅助手段。
ØC++中的友元为数据隐藏这堵不透明的墙开了一个小孔,外界可通过这个小孔窥视类内部的秘密,友元是一扇通向私有成员的后门。
Ø友元可分为:友元函数,友元成员,友元类。
Ø友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员和公有成员。
Ø在类定义中声明友元函数时,需在其函数名前加上关键字friend。此声明可以放在公有部分,也可以放在私有部分。友元函数可以定义在类的内部,也可以定义在类的外部。
1.友元函数虽然可以访问类对象的私有成员,但它毕竟不是成员函数。因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名::”。
2.友元函数一般带有一个该类的入口参数。因为友元函数不是类的成员,所以它不能直接引用对象成员的名称,也不能通过this指针引用对象的成员,它必须通过作为入口参数传递进来的对象名或对象指针来引用该对象的成员。
3.当一个函数需要访问多个类时,友元函数非常有用,普通的成员函数只能访问其所属的类,但是多个类的友元函数能够访问相应的所有类的数据。
例程序2使用一个友元函数访问两个不同的类
4.友元函数通过直接访问对象的私有成员,提高了程序运行的效率。在某些情况下,如运算符被重载时,需要用到友元。但是友元函数破坏了数据的隐蔽性,降低了程序的可维护性,这与面向对象的程序设计思想是背道而驰的,因此使用友元函数应谨慎。
Ø除了一般的函数可以作为某个类的友元外,一个类的成员函数也可以作为另一个类的友元,这种成员函数不仅可以访问自己所在类对象中的私有成员和公有成员,还可以访问friend声明语句所在类对象中的私有成员和公有成员,这样能使两个类相互合作、协调工作,完成某一任务。
Ø例程序3使用友元成员函数访问另一个类
说明:
1.一个类的成员函数作为另一个类的友元函数时,必须先定义这个类。例如上例中,类boy的成员函数为类girl的友元函数,必须先定义类boy。并且在声明友元函数时,要加上成员函数所在类的类名,如:
friend void boy::disp(girl &);
2.程序中还要使用“向前引用”,因为函数disp()中将girl &作为参数,而girl要晚一些时候才定义。
Ø不仅函数可以作为一个类的友元,一个类也可以作为另一个类的友元。这种友元类的说明方法是在另一个类声明中加入语句“friend 类名;”,其中的“类名”即为友元类的类名。此语句可以放在公有部分也可以放在私有部分,例如:
class Y{
//……
};
class X{
//……
friend Y;
//……
};
Ø当一个类被说明为另一个类的友元时,它的所有的成员函数都成为另一个类的友元函数,这就意味着为友元的类中的所有成员函数都可以访问另一个类的私有成员。
例程序4友元类
说明:
1.友元关系是单向的,不具有交换性(我是你的朋友,不能推断出:你是我的朋友)。
2.友元关系也不具有传递性(我是你的朋友,你是他的朋友,不能推断出:我是他的朋友)。
通过下面几个程序我们来了解一下友元函数
程序1 使用友元函数
#include
#include
class girl{
private:
char *name;
int age;
public:
girl(char *n,int d)
{ name=new char[strlen(n)+1];
strcpy(name,n);
age=d;
}
friend void disp(girl &); //声明为友元函数
~girl(){delete name;}
};
void disp(girl &x) //定义友元函数
{
cout<<"girl\'s name
is:"<<<<",age:"<<x.age<<endl;
}
void main()
{
girl e("Chen Xingwei",18);
disp(e); //调用友元函数
}
程序2使用一个友元函数访问两个不同的类
#include <iostream.h>
#include
class boy; //向前引用
class girl{
char name[25];
int age;
public:
void init(char N[],int A);
friend void prdata(const girl plg,const boy plb); //声明函数为girl 类的友元函数
};
void girl::init(char N[],int A)
{ strcpy(name,N);
age=A;
}
class boy{
char name[25];
int age;
public:
void init(char N[],int A);