科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件『21天精通C++』第二周学习笔记(2-2

『21天精通C++』第二周学习笔记(2-2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:雷神 来源:中国软件网 2008年3月31日

关键字: 笔记 精通 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

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

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

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

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

file://一个例子:
#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操作算子函数。
下标符号也可以重载,使得余下的程序可以访问单个的成员或成员的数组元素。使用下标符号能创建安全的数组,能实现上下界自检。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章