关于C++友元的一些思考

转载 2012年03月28日 10:10:43
源地址:http://blog.csdn.net/tigernorth/article/details/6385190

    友元在C++里面是一个比较重要的东西,对于类里面声明的私有数据与函数,如果在某些应用需求下需要被其他函数调用,这时候就需要使用友元函数。就好像给了一个声明,说某某函数是我这个类的一个好朋友,你们可以大胆地放他进入我的闺房,访问我的数据。

    在C++里面,我们定义友元是使用friend 这个关键字。声明友元函数可以有下面四种情况。

  1. class X {  
  2. private:  
  3.   int i;  
  4. public:  
  5.   friend void h();  
  6.   friend class Z;  
  7.   friend void g(X*, int);  
  8.   friend Y::f(X*);  
  9. };  

 

friend void h(); 声明的友元函数是一个全局函数,这里其实做了两件事,一件事声明一个函数 void h();,另一件事是声明该函数属于X类的一个友元函数。

friend class Z 声明类Z是友元类,即类Z里面所有方法都可以引用A中的私有数据与私有函数。

friend void g(X*, int) 这个是比较常用的方式,跟上面的全局函数是一样的。

要强调的是friend Y::f(X*); 制定在类Y里面的特定函数为友元。这里有一个问题要注意到,就是声明的顺序。在声明友元函数之前必然是要求先声明类Y以及类Y里面的f()方法,不然系统是找不到对应的类。然后由于类Y里面有类X作为参数,也必然需要在声明函数f()之前先有类X的声明。这无疑是一个很大的矛盾。如何解决这个矛盾呢,是有技巧的。

[c-sharp] view plaincopy
  1. class X;  
  2.    
  3. class Y {  
  4.   void f(X*);  
  5. };  
  6.   
  7. class X {  
  8. private:  
  9.   int i;  
  10. public:  
  11.   friend void h();  
  12.   friend class Z;  
  13.   frined void g(X*, int);  
  14.   friend Y::f(X*);  
  15. };  

  如上面代码所示,我们在声明f(X*)之前有了类X的一个声明,这里仅仅是声明,并没有定义。在声明友元之前也有类Y的一个声明,这就圆了场。然而也要注意到,这里有一个细节,f(X*)的参数是一个指针。由于在类Y前面类X只是一个声明,但是对于类X的大小,在扫描到类Y时是未知的,所以只能传入一个指针来解决这个冲突。

有关转变、转型的一些思考

前言 本篇文章的“启源”大概来自以下几个方面 1.七月份在读的《如何阅读一本书》 【 莫提默·J. 艾德勒、查尔斯·范多伦 商务印书馆】07.28参加的知乎live《如何结束以及如何重新开始》 【...
  • Riven_wn
  • Riven_wn
  • 2016-07-29 14:38:02
  • 465

关于公司建设的一些思考

序: 一些经历,过了就可能忘了,不能形成经验。所以有时间把自己的一些亲身经历和思考总结出来,可供以后参考。 (由于个人经历有限,以下总结,大多数只限于研发类的公司,特别是软件研发类的公司) (我的...
  • zollty
  • zollty
  • 2016-12-30 14:57:35
  • 457

c++模板类的模板类友元示例

 public.h#include#ifndef _PUBLIC_H_#define _PUBLIC_H_template class second;templateclass first{     ...
  • wbj1234566
  • wbj1234566
  • 2008-04-16 13:20:00
  • 485

一次自我反思与自己最近的一些想法

突发奇想的想把自己最近的想法写一写。   按照部里大佬的要求,我应该是要每周写一份自我总结的,但从我的文章数量来看,从我的自我总结从word文档的形式转变为博客之后,我就只写了一篇自我总结。说实话,...
  • alucarddavid
  • alucarddavid
  • 2017-12-11 21:41:01
  • 121

人生需要认真思考的一些故事

1、断箭 不相信自己的意志,永远也做不成将军。 春秋战国时代,一位父亲和他的儿子出征打战。父亲已做了将军,儿子还只是马前卒。又一阵号角吹响,战鼓雷鸣了,父亲庄严地托起一个箭囊,其中插着一只箭。父亲郑重...
  • shzpu
  • shzpu
  • 2008-07-08 16:12:00
  • 531

WMS仓储系统值得提高的功能点

====================供货商管理================== 1、补货 2、退货 ====================收货管理===============...
  • boonya
  • boonya
  • 2016-11-10 14:14:15
  • 825

关于企业内部系统访问地址的一些思考

  • u013560667
  • u013560667
  • 2014-06-11 10:33:33
  • 582

c++友元实现操作符重载

运算符重载的本质是一个函数#include using namespace std;class A { private: int m_a; int m_b; friend A ...
  • sjtu_chenchen
  • sjtu_chenchen
  • 2015-08-22 16:14:29
  • 1995

外贸跨境电商的一些思考

这几个月这个行业又发生了一些事,写下来做些思考。 1、有棵树融资4个亿,12家跨境电商上市,加上后续正准备上市的公司,资本寒冬下还能如此逆势增长,说明这个行业还大有可为。另一方面,大卖家慢慢变成大公司...
  • scjthree
  • scjthree
  • 2017-01-17 10:29:51
  • 299

C++运算符重载(注意点),友元(使用和优缺点)

运算符重载实例代码class A{ public: int a,b; A(int _a=0,int _b=0):a(_a),b(_b){} A operator+(A & tm...
  • qq_26437925
  • qq_26437925
  • 2016-12-26 19:12:41
  • 653
收藏助手
不良信息举报
您举报文章:关于C++友元的一些思考
举报原因:
原因补充:

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