C++友元 friend

 今天给大家介绍的是C++中的友元。之前介绍过const,友元的关键字是friend。但是friendconst还是有一些区别,因为友元这里不仅仅可以用来修饰函数,友元还可以是一个类。

这里说一下友元到底是什么,友元的友就可以大概看出来这个关键字的具体作用,大家都知道我们在定义类的时候会有publicprivate,通常我们的函数是public公有的,但是我们的成员都是私有的。当友元形容一个类的时候,他就提供了非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数。也可以将类A指定为类B的友元,则类A是类B的友元类,类A的所有成员函数均是类B的友元函数,均可以访问类B的非公有成员。

  友元函数的注意事项:

        (1)友元函数不是类的成员函数,在函数体中访问对象的成员,必须用“对象名.对象成员"方式来访问, 友元函数可以访问类中的所有成员(公有,私有,保护),而一般的函数只能访问类的公有成员。

        (2)友元函数不受类中的访问权限关键字的限制,可以将它放在类的公有,私有,保护部分,结果均一样。

        (3)某类的友元函数的作用域并非该类作用域,如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

        (4)友元函数破坏了面向对象设计的封装特性。所以应该尽量少用。

        友元类

        如果某类B的成员函数会频繁地访问类A的数据成员,而类A的数据成员的private/protected限制造成了类B存取的麻烦,B只能通过A的Public的成员函数进行间接存取。这种情况下可以将类B作为类A的友元类,即类A向类B提供私有和保护成员的访问权限,让类B可以直接存取。

        友元类中的所有成员函数均可以看作是另一类的友元函数。

  通过字面的意思还是理解的不透彻,下边给大家举个栗子来说一下友元到底是如何用的。

 

通过g++编译之后

 

会发现程序是不能通过编译的,这里给的提示是show这个函数在这个范围内没有定义,也就是说他并没有找到show函数。因为这个函数的作用域在test类里边,我们只能通过一个类的对象来调用这个函数。

 

这是当我们在show前边加了我们friend友元定义的时候

 

编译就没有任何问题了。

 

执行的时候就能看到date的数据已经成功输出了。这就是friend友元在函数中的作用。

当然友元还能用来修饰类即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数

下边通过程序简单给大家看一下友元类的作用。

 

 

这里我们定义了两个类,一个是A一个是B,之后将B设定成了A的友元类,也就是B能访问A中的成员。

 

 

这时候我们再去编译运行结果会发现,我们在只定义B成员的情况下我们成功调用了A类的构造函数B类的构造函数,并且成功的将类A中的私有成员a输出来出来,所以这里的友元类在有的时候还是十分方便的。

  友元的用法和指针感觉性质有些类似,他可以做很多事情,但是是有利有弊的,如果用不好可能会有很大的问题,所以大家在使用的时候还是要仔细考虑清楚,尽量避免过多的使用友元来解决问题。

 

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/80890946
今日推荐