入门教程:实例详解C++友元

2016-02-19 19:59 6 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享入门教程:实例详解C++友元,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - 编程语言 】

在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:
  
   !-- frame contents -- !-- /frame contents --   通常对于普通函数来说,要访问类的保护成员是不可能的,假如想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。
  
    友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但矛盾的是,即使是最大限度的保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。
  
  在类里声明一个普通函数,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。
  
  下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的。#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 -- #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(); 
  }  一个类的成员函数函数也可以是另一个类的友元,从而可以使得一个类的成员函数可以操作另一个类的数据成员,我们在下面的代码中增加一类Country,注重观察:#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(); 
  }  整个类也可以是另一个类的友元,该友元也可以称做为友类。友类的每个成员函数都可以访问另一个类的所有成员。
   更多内容请看ASP.NET教程  C/C++技术学堂  C/C++技术专题专题,或
  示例代码如下:#include iostream   
  using namespace std; 
  class Internet; 
   !-- frame contents -- !-- /frame contents --  
  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/1622489.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,边看边做,这样你的印象会更加深刻一点,顺便也看看我哪里...
1.对应的new和delete要采用相同的形式 下面的语句有什么错? string *stringarray = new string[100]; ... delete stringarray; 一切好象都井然有序——一个new对应着一个delete——然而却隐藏着很大的错误:程序的运行情况将是不可猜测的。至少,stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他...
1. C++虽然主要是以C的基础发展起来的一门新语言,但她不是C的替代品,不是C的升级,C++和C是兄弟关系。没有谁比谁先进的说法,更重要的一点是C和C++各自的标准委员会是独立的,最新的C++标准是C++98,最新的C标准是C99。因此也没有先学C再说C++的说法,也不再(注意这个"不再")有C++语法是C语法的超集的说法。 2. C++/CLI 和&...
程序作者:管宁 个人网站:www.cndev-lab.com VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的熟悉造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,假如形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,...

经验教程

445

收藏

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