Vb教程 Vb.net教程 Vfp教程 C/C++教程 Vc/Vc++教程 Delphi教程 Java教程 Powerbuilder
  杀毒频道 | 短信频道 | 网络电视 | 论文中心 | 学上网 | 学软件 | 网页特效 | 电脑基础 | 论坛  
  NCRE | 软考 | CET | 职称英语 | 司法考试 | 报关员 | 公务员 | CATTI | CPA考试  
  Html教程 | Css教程 | Xml教程 | Asp教程 | Asp.net | Php教程 | Jsp教程 | Linux教程 | QQ技巧  
Photoshop Illustrator ImageReady Maya教程 3D Max教程 Lightscape Coredraw教程 Authorware Autocad教程 Freehand教程
Access教程 Mysql教程 Sql server Oracle教程 Word教程 Excel教程 Powerpoint Frontpage Asp.net源码 Php源代码
Flash教程 Fireworks Dreamweaver C#教程 outlook教程 系统安装 vbscript教程 Javascript Jsp源代码 Asp源代码
您的位置:首页 >> C/C++教程 >> 正文

『21天精通C++』第二周学习笔记(2-2)
文章来源:pconline

作者:雷神
转载请联系作者

第十天:友元函数和友元类使得程序员在不放弃私有数据安全性的情况下,对特定的函数或类进行访问。

   要想通过一个打印函数打印类中的数据成员,要么函数是类中的一个成员,要么是友元函数。注意友元函数不是类成员,而是位于类作用域外的函数。定义友元函数时只需将它的函数原型插入类定义,象声明成员函数一样,再在函数原型前加入关键字friend即可。类本身决定友元的存在。友元函数是非成员函数,所以它无法通过this指针获得一份拷贝,因此必须给友元函数传递一个对象变量,这一点和其他非成员函数是一样的,不同的是友元函数可以访问类的私有数据。

   友元函数必须带有某类变量为参数,才能获取对象数据并对其操作。
   一个独立的友元函数可以访问多个类的数据,但必须同时为这多个类的友元。//注意:向前引用是类的原型说明。

   当一个类需要访问另一个类的某几个或全部私有数据或是私有成员函数时,将其声明为友元类。友元类是一个单独的类它可以访问另一个类中的所有成员。友元类中含有一个成员,它的类型是声明了这个友元类的类。即使一个类不是友元类,它的成员也可能是其它类的对象,但是该类将无法访问其对象成员的私有成员。

//一个例子:
#include
#include
#include
class Boyssoftball;//类声明,因为另一个类要引用到它,如友元函数,所以必须先定义。
class Girlssoftball{
char name[25];
int age;
float batavg;
public:
void init(char N[],int A,float B);
friend void prdata(const Girlssoftball p1g,const Boyssoftball p1b);
};
void Girlssoftball::init(char N[],int A,float B){
strcpy(name,N);
age=A;
batavg=B;
}
class Boyssoftball{
char name[25];
int age;
float batavg;
public:
void init(char N[],int A,float B);
friend void prdata(const Girlssoftball p1g,const Boyssoftball p1b);
};
void Boyssoftball::init(char N[],int A,float B){
strcpy(name,N);
age=A;
batavg=B;
}
main()
{
Girlssoftball *Gplayer[3];
Boyssoftball *Bplayer[3];
for(int i=0;i<3;i++){
Gplayer[i]=new Girlssoftball;
Bplayer[i]=new Boyssoftball;
}
Gplayer[0]->init("stacy",12,1.34);
Gplayer[1]->init("suci",13,2.34);
Gplayer[2]->init("ketey",12,3.434);
Bplayer[0]->init("tom",12,4.434);
Bplayer[1]->init("jone",12,5.504);
Bplayer[2]->init("hunter",13,6.496);
for(int n=0;n<3;n++){
prdata(*Gplayer[n],*Bplayer[n]);}
for(int j=0;j<3;j++){
delete Gplayer[j];
delete Bplayer[j];
}
return 0;
}
void prdata(const Girlssoftball p1g,const Boyssoftball p1b){
cout< cout<<"player name:"< cout<<"player age:"< cout<<"player average:"< cout<<"player name:"< cout<<"player age:"< cout<<"player average:"< }

第十一天和第十二天:

   当需要对自定义数据类型进行类似于对内部数据类型进行内部操作时使用操作符重载函数。
   尽可能的编写全面的operator...()函数,以便操作符两边出现不同数据类型组合时,操作符重载依旧有效。
   再操作符重载函数中不要将多余的参数传递进去,VC++象处理其它成员函数一样负责传送接受this指针。
   不要远离操作符原来的意思。

   在重载操作符两边放置同名的类变量,可以使得一个类变量为空。
可以使用友元函数编写要把内部数据类型和自定义数据类型进行操作的,操作符重载函数。
如果将与复合操作符等价的操作符重载了,最好也重载该复合操作符。如如果重载了*最好将*=也重载。这样做的好处是有助于丰富类的功能。
在重载复合操作符时一定要返回一个this指针的间接引用。这种操作符必须返回一个左边操作符被修改的备份。
   不能精确的比较两个浮点数的值。不要轻易重载关系比较符。如与&&或||。
   如果要把内部数据作为左操作符而自定义数据类型作右操作符时,为了防止this指针的干扰,又为了能访问类中的私有成员,所以必须用友元函数。
重载递增及递减操作符也必须返回this指针。

   学习了输入<<和输出>>操作符的重载,通过编写简单的operator<<(),掌握了一种方法,将main()函数的烦琐细节除去,交给自定义的类去处理。istream和ostream的对象是和输入输出流数据相连的,由于能够存取流中数据,就还可以编写I/O操作算子函数。
下标符号也可以重载,使得余下的程序可以访问单个的成员或成员的数组元素。使用下标符号能创建安全的数组,能实现上下界自检。

[返回]

编程语言 web开发 数据库 网络技术 操作系统 服务器 网页设计 图形设计 办公软件 常用软件 学电脑

Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved.
关于本站 | 版权声明 | 联系我们 | 友情链接 |
编程入门网 版权所有