织梦CMS - 轻松建站从此开始!

罗索

关于c++的友元机制

落鹤生 发布于 2010-12-28 10:52 点击:次 
下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的。
TAG:

下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的

//程序作者:管宁
//所有稿件均有版权,如要转载,请务必著名出处和作者

  1. #include <iostream> 
  2. using namespace std; 
  3. class Internet 
  4. public
  5.     Internet(char *name,char *address)
  6.  // 改为:internet(const char *name , const char *address) 
  7.     { 
  8.         strcpy(Internet::name,name); 
  9.         strcpy(Internet::address,address); 
  10.     } 
  11.     friend void ShowN(Internet &obj); //友元函数的声明 
  12. public// 改为:private 
  13.     char name[20]; 
  14.     char address[20]; 
  15. }; 
  16. void ShowN(Internet &obj)
  17. //函数定义,不能写成,void Internet::ShowN(Internet &obj) 
  18.     cout<<obj.name<<endl; //可访问internet类中的成员 
  19. void main() 
  20.     Internet a("罗索工作室","www.rosoo.net"); 
  21.     ShowN(a); 
  22.     cin.get(); 

上面的代码通过友元函数的定义,我们成功的访问到了a对象的保护成员name,友元函数并不能看做是类的成员函数,它只是个被声明为类友元的普通函数,所以在类外部函数的定义部分不能够写成void Internet::ShowN(Internet &obj),这一点要注意。

一个普通函数可以是多个类的友元函数,对上面的代码我们进行修改,注意观察变化:

//程序作者:管宁
//所有稿件均有版权,如要转载,请务必著名出处和作者

  1. #include <iostream> 
  2. using namespace std; 
  3. class Country; 
  4. class Internet 
  5. public
  6.     Internet(char *name,char *address)
  7. // 改为:internet(const char *name , const char *address) 
  8.     { 
  9.         strcpy(Internet::name,name); 
  10.         strcpy(Internet::address,address); 
  11.     } 
  12.     friend void ShowN(Internet &obj,Country &cn);//注意这里 
  13. public
  14.     char name[20]; 
  15.     char address[20]; 
  16. }; 
  17. class Country 
  18. public
  19.     Country() 
  20.     { 
  21.         strcpy(cname,"中国"); 
  22.     } 
  23.     friend void ShowN(Internet &obj,Country &cn);//注意这里 
  24. protected
  25.     char cname[30]; 
  26. }; 
  27.  
  28. void ShowN(Internet &obj,Country &cn) 
  29.     cout<<cn.cname<<"|"<<obj.name<<endl; 
  30. void main() 
  31.     Internet a("罗索工作室","www.rosoo.net"); 
  32.     Country b; 
  33.     ShowN(a,b); 
  34.     cin.get(); 

一个类的成员函数函数也可以是另一个类的友元,从而可以使得一个类的成员函数可以操作另一个类的数据成员,我们在下面的代码中增加一类Country,注意观察

//程序作者:管宁
//所有稿件均有版权,如要转载,请务必著名出处和作者

  1. #include <iostream> 
  2. using namespace std; 
  3. class Internet; 
  4. class Country 
  5. public
  6.     Country() 
  7.     { 
  8.         strcpy(cname,"中国"); 
  9.     } 
  10.     void Editurl(Internet &temp);//成员函数的声明 
  11. protected
  12.     char cname[30]; 
  13. }; 
  14. class Internet 
  15. public
  16.     Internet(char *name,char *address) 
  17.     { 
  18.         strcpy(Internet::name,name); 
  19.         strcpy(Internet::address,address); 
  20.     } 
  21.     friend void Country::Editurl(Internet &temp); //友元函数的声明 
  22. protected
  23.     char name[20]; 
  24.     char address[20]; 
  25. }; 
  26. void Country::Editurl(Internet &temp) //成员函数的外部定义 
  27.     strcpy(temp.address,"edu.cndev-lab.com"); 
  28.     cout<<temp.name<<"|"<<temp.address<<endl; 
  29. void main() 
  30.     Internet a("罗索工作室","www.rosoo.net"); 
  31.     Country b; 
  32.     b.Editurl(a); 
  33.     cin.get(); 

整个类也可以是另一个类的友元,该友元也可以称做为友类。友类的每个成员函数都可以访问另一个类的所有成员

  1. #include <iostream> 
  2. using namespace std; 
  3. class Internet; 
  4. class Country 
  5. public
  6.     Country() 
  7.     { 
  8.         strcpy(cname,"中国"); 
  9.     } 
  10.     friend class Internet;//友类的声明 
  11. protected
  12.     char cname[30]; 
  13. }; 
  14. class Internet 
  15. public
  16.     Internet(char *name,char *address) 
  17.     { 
  18.         strcpy(Internet::name,name); 
  19.         strcpy(Internet::address,address); 
  20.     } 
  21.     void Editcname(Country &temp); 
  22. protected
  23.     char name[20]; 
  24.     char address[20]; 
  25. }; 
  26. void Internet::Editcname(Country &temp) 
  27.     strcpy(temp.cname,"中华人民共和国"); 
  28. void main() 
  29.     Internet a("罗索工作室","www.rosoo.net"); 
  30.     Country b; 
  31.     a.Editcname(b); 
  32.     cin.get(); 
(管宁)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10679.html]
本文出处:cndev-lab.com 作者:管宁
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容