c++友元的入门教程

2016-02-19 19:14 5 1 收藏

下面是个c++友元的入门教程教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】

在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:
  
   !-- frame contents -- !-- /frame contents -- 通常对于普通函数来说,要访问类的保护成员是不可能的,假如想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。
  
  友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但所矛盾的是,即使是最大限度大保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。
  
  在类里声明一个普通憨数学,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。
  
  下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的。
  
  
  //程序作者:管宁
  //站点:www.cndev-lab.com
  //所有稿件均有版权,如要转载,请务必闻名出处和作者
  
  #include iostream
  using namespace std;
  class Internet
  {
  public:
  Internet(char *name,char *address)
  {
  strcpy(Internet::name,name);
  strcpy(Internet::address,address);
  }
  friend void ShowN(Internet &obj);//友元函数的声明
  public:
  char name[20];
  char address[20];
  };
  
  
  void ShowN(Internet &obj)//函数定义,不能写成,void Internet::ShowN(Internet &obj)
  {
  coutobj.nameendl;
  }
  void main()
  {
  Internet a("中国软件开发实验室","www.cndev-lab.com");
  ShowN(a);
  cin.get();
  }
  

  
  上面的代码通过友元函数的定义,我们成功的访问到了a对象的保护成员name,友元函数并不能看做是类的成员函数,它只是个被声明为类友元的普通函数,所以在类外部函数的定义部分不能够写成void Internet::ShowN(Internet &obj),这一点要注重。
   更多内容请看Asp.Net教程  C/C++技术学堂  C/C++技术专题专题,或 一个普通函数可以是多个类的友元函数,对上面的代码我们进行修改,注重观察变化:
  
   !-- frame contents -- !-- /frame contents --
  //程序作者:管宁
  //站点:www.cndev-lab.com
  //所有稿件均有版权,如要转载,请务必闻名出处和作者
  
  #include iostream
  using namespace std;
  class Country;
  class Internet
  {
  public:
  Internet(char *name,char *address)
  {
  strcpy(Internet::name,name);
  strcpy(Internet::address,address);
  }
  friend void ShowN(Internet &obj,Country &cn);//注重这里
  public:
  char name[20];
  char address[20];
  };
  
  class Country
  {
  public:
  Country()
  {
  strcpy(cname,"中国");
  }
  friend void ShowN(Internet &obj,Country &cn);//注重这里
  protected:
  char cname[30];
  };
  
  void ShowN(Internet &obj,Country &cn)
  {
  coutcn.cname""obj.nameendl;
  }
  void main()
  {
  Internet a("中国软件开发实验室","www.cndev-lab.com");
  Country b;
  ShowN(a,b);
  cin.get();
  }
  

     更多内容请看ASP.NET教程  C/C++技术学堂  C/C++技术专题专题,或 一个类的成员函数函数也可以是另一个类的友元,从而可以使得一个类的成员函数可以操作另一个类的数据成员,我们在下面的代码中增加一类Country,注重观察:
  
   !-- frame contents -- !-- /frame contents --
  //程序作者:管宁
  //站点:www.cndev-lab.com
  //所有稿件均有版权,如要转载,请务必闻名出处和作者
  
  #include iostream
  using namespace std;
  class Internet;
  
  class Country
  {
  public:
  Country()
  {
  strcpy(cname,"中国");
  }
  void Editurl(Internet &temp);//成员函数的声明
  protected:
  char cname[30];
  };
  class Internet
  {
  public:
  Internet(char *name,char *address)
  {
  strcpy(Internet::name,name);
  strcpy(Internet::address,address);
  }
  friend void Country::Editurl(Internet &temp);//友元函数的声明
  protected:
  char name[20];
  char address[20];
  };
  void Country::Editurl(Internet &temp)//成员函数的外部定义
  {
  strcpy(temp.address,"edu.cndev-lab.com");
  couttemp.name""temp.addressendl;
  }
  void main()
  {
  Internet a("中国软件开发实验室","www.cndev-lab.com");
  Country b;
  b.Editurl(a);
  cin.get();
  }
  
  整个类也可以是另一个类的友元,该友元也可以称做为友类。友类的每个成员函数都可以访问另一个类的所有成员。
  
  示例代码如下:
  
  
  //程序作者:管宁
  //站点:www.cndev-lab.com
  //所有稿件均有版权,如要转载,请务必闻名出处和作者
  
  #include iostream
  using namespace std;
  class Internet;
  
  class Country
  {
  public:
  Country()
  {
  strcpy(cname,"中国");
  }
  friend class Internet;//友类的声明
  protected:
  char cname[30];
  };
  class Internet
  {
  public:
  Internet(char *name,char *address)
  {
  strcpy(Internet::name,name);
  strcpy(Internet::address,address);
  }
  void Editcname(Country &temp);
  protected:
  char name[20];
  char address[20];
  };
  void Internet::Editcname(Country &temp)
  {
  strcpy(temp.cname,"中华人民共和国");
  }
  void main()
  {
  Internet a("中国软件开发实验室","www.cndev-lab.com");
  Country b;
  a.Editcname(b);
  cin.get();
  }
  

  
  在上面的代码中我们成功的通过Internet类Editcname成员函数操作了Country类的保护成员cname。
  
  在编程中,我们使用友元的另外一个重要原因是为了方便重载操作符的使用,这些内容我们将在后面的教程着重讨论!
   更多内容请看ASP.NET教程  C/C++技术学堂  C/C++技术专题专题,或

来源:http://www.tulaoshi.com/n/20160219/1620425.html

延伸阅读
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者 #include iostream #include string using namespace std; void main(int argc,char* argv[]) { int a=10; int b=20; int &rn=a; coutrn"|"aendl; cout&rn"|"&aendl;//c++中是无法取得应用的内存地址的,取引用的地址就...
标签: flash教程
本文为中国合作伙伴印象特别供稿,转载必须取得 授权 前 言           我写的这些教程,目的是希望初学Flash的爱好者们能多动手,少提问。我下面这些教程面象有 Flash(MX) 基础操作知识的读者。在看我的教程的同时,希望也能打开Flash,边看边做,这样你的印象会更加深刻一点,顺便也看看我哪里...
“N次失败,1次成功,还学的不怎么样……你也太笨了吧!”假如您有这样的评价,那么祝贺您,您已经了解了我这人的99.9%。N这个数字具体是多少连我自己也记不清楚,保守地讲(N≥6==TRUE)这个表达式是能够成立的。 !-- frame contents -- !-- /frame contents -- 回想我的VisualC++入门过程,一路过来,绝对不是像黄飞鸿的功夫那...
程序作者:管宁 个人网站:www.cndev-lab.com VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的熟悉造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,假如形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,...
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什...

经验教程

711

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部