求大神赐教是什么意思,当友元函数的叁数是对象数组时,在主函数中要怎么调用该友元函数。

为什么C++里类的友元函数的实现不放在主函数所在的文件里就不能被调用?
&img data-rawheight=&460& data-rawwidth=&673& src=&/065abf6adef74adb393acb_b.jpg& class=&origin_image zh-lightbox-thumb& width=&673& data-original=&/065abf6adef74adb393acb_r.jpg&&&img data-rawheight=&694& data-rawwidth=&877& src=&/5cbef62e7ec776ea91eb2_b.jpg& class=&origin_image zh-lightbox-thumb& width=&877& data-original=&/5cbef62e7ec776ea91eb2_r.jpg&&前两张图片是在主函数所在文件实现友元函数后运行的结果,后面的两张是直接在友元函数声明时实现编译器报错的结果。&br&----------------------------------------&br&----------------------------------------&br&&img data-rawheight=&490& data-rawwidth=&492& src=&/a1b0ff5246089eab8f0d143f_b.jpg& class=&origin_image zh-lightbox-thumb& width=&492& data-original=&/a1b0ff5246089eab8f0d143f_r.jpg&&&img data-rawheight=&175& data-rawwidth=&867& src=&/fd2fad5aad_b.jpg& class=&origin_image zh-lightbox-thumb& width=&867& data-original=&/fd2fad5aad_r.jpg&&
按投票排序
友元函数不是成员函数,不要在类定义里定义友元函数。应该这样:class Test
friend void printTest(const Test&); //声明
void printTest(const Test& t)
定义不需要放在主函数所在的文件里。
#include &iostream&
using namespace std;
class Test;
// 这才是函数声明
void printTest(const Test& t);
class Test {
Test (int i) : a(i) {}
Test (const Test& t) : a(t.a) {}
// 这只是声明友情
friend void printTest(const Test&);
void printTest(const Test& t) {
cout && t.a && endl;
int main() {
printTest(5);
已有帐号?
无法登录?
社交帐号登录C++友元函数在主函数中调用时显示,该函数不属于该类_百度知道
C++友元函数在主函数中调用时显示,该函数不属于该类
void settime(};Dfriend void adday(CDate&),#include&quot,int ).h&======================================#include&lt.display():int year.display();
void display();public.h&day.settime(2008.adday(day);virtual ~CDate();dayclass CDate
{void main(){CDate day,29),2;CDate()
提问者采纳
因此不能使用对象调用友元函数不是成员函数:adday( day )。改为.adday(day)
提问者评价
其他类似问题
为您推荐:
友元函数的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁所有回答(8)
友元函数是一些不是类成员却能够访问类的所有成员的函数。。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。
举个简单的例子:一个聚会中,有一个舞台,大家都可以去跳舞,而包厢则进不去,VIP就可以了
这个例子不知道好理解不?
可以理解为中国特色的走后门。
友元函数可以访问私有成员. 可以理解为是private给他的特权
友元的使用主要是为了提高效率和方便编程。有时候,普通函数需要直接访问一个类的保护或私有数据成员,如果没有友元机制,则只能将类的数据成员声明为公共的,然后却导致任何函数都可以无约束的访问它了。在类里声明一个普通函数,标上friend,就变成了该类的友元,可以访问该类的一切成员
需要友元的另外一个原因是为了方便重载操作符的使用。
友元函数不是成员函数,它是类的朋友,因而可以访问类的全部成员。在类的内部只能声明它的函数原型,加上friend关键字。
友元函数是独立的,简单点就是类似类外部定义的函数了,提供友元功能是为了让函数可以访问类中私有变量
使用的话是按需来走的
还有中应用就是操作符的重载了~
如果你愿意读英文,可以看这篇介绍
我个人的看法C++里面加上friend完全是C++的创始人为了讨好各种各样的用户而往C++里面加的奇奇怪怪的东西。
不能说friend没用,而是说friend这个东西精巧的普通人都用不好。
C++中友元函数不属于类,不是类的成员函数,它的存在提供了外部函数访问类对象私有成员的权限,换句话说,这个类的对象在友元函数内部可以表现私有的成员。 &
就像一种社会现象:&关系&,&走后门&
friend是在软件设计中 共享与封装矛盾产生的一个解决方案
&&&您需要以后才能回答,未注册用户请先。求大神赐教,当友元函数的叁数是对象数组时,在主函数中要怎么调用该友元函数。_百度知道
求大神赐教,当友元函数的叁数是对象数组时,在主函数中要怎么调用该友元函数。
因此不能使用对象调用友元函数不是成员函数。
day: adday( day ); 改为.adday(day)
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
友元函数的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁19387人阅读
1、为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率
&&&&& 具体来说:为了使其他类的成员函数直接访问该类的私有变量
&&&&& 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数
&&&&& 优点:能够提高效率,表达简单、清晰
&&&&&&缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。
2、什么时候使用友元函数:
&&&&&&1)运算符重载的某些场合需要使用友元。
&&&&&&2)两个类要共享数据的时候
3、怎么使用友元函数:
友元函数的参数:
&&&&&& 因为友元函数没有this指针,则参数要有三种情况:
&&&&&& 1、& 要访问非static成员时,需要对象做参数;--常用(友元函数常含有参数)
&&&&&&&2、& 要访问static成员或全局变量时,则不需要对象做参数
&&&&&&&3、& 如果做参数的对象是全局对象,则不需要对象做参数
友元函数的位置:
&&&&&& 因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。
友元函数的调用:
&&&&&& 可以直接调用友元函数,不需要通过对象或指针
友元函数的分类:
根据这个函数的来源不同,可以分为三种方法:
1、普通函数友元函数:
&&&&&&&a)&目的:使普通函数能够访问类的友元
&&&&&& b) 语法:声明位置:公有私有均可,常写为公有
&&&&&&&&&&&&&&&&&&&&&&& 声明: friend&+ 普通函数声明
&&&&&&&&&&&&&&&&&&&&&&& 实现位置:可以在类外或类中
&&&&&&&&&&&&&&&&&&&&&&& 实现代码:与普通函数相同(不加不用friend和类::)
&&&&&&&&&&&&&&&&&&&&&&& 调用:类似普通函数,直接调用
&&&&&&&c)&代码:&&&&&&&&
class INTEGER
friend void Print(const INTEGER& obj);//声明友元函数
void Print(const INTEGER& obj)//不使用friend和类::
void main()
Print(obj);//直接调用
2、类Y的所有成员函数都为类X友元函数—友元类
&&&&&&a)目的:使用单个声明使Y类的所有函数成为类X的友元
&&&&&&&&&&&&&&&&&&&&&&& 它提供一种类之间合作的一种方式,使类Y的对象可以具有类X和类Y的功能
&&&&&&&&&&&&&&&&&&&&&&& 具体来说:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&前提:A是B的友元(=》A中成员函数可以访问B中有所有成员,包括私有成员和公有成员--老忘)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&则:在A中,借助类B,可以直接使用~B . 私有变量~的形式访问私有变量
&&&&& b)语法:声明位置:公有私有均可,常写为私有(把类看成一个变量)
&&&&&&&&&&&&&&&&&&&&&&& 声明: friend&+&类名---不是对象啊
&&&&&&&&&&&&&&&&&&&&&&& 调用:
&&&&& c)代码:
void disp(girl &);
void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数
cout&&&boy's name is:&&&name&&&,age:&&&age&&//正常情况,boy的成员函数disp中直接访问boy的私有变量
cout&&&girl's name is:&&&x.name&&&,age:&&&x.age&&
//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量
//正常情况下,只允许在girl的成员函数中访问girl的私有变量
class girl
//声明类boy是类girl的友元
void main()
b.disp(g);
//b调用自己的成员函数,但是以g为参数,友元机制体现在函数disp中
3、类Y的一个成员函数为类X的友元函数
&&&&& a)目的:使类Y的一个成员函数成为类X的友元
&&&&&&&&&&&& 具体而言:而在类Y的这个成员函数中,借助参数X,可以直接以X。私有变量的形式访问私有变量
&&&&& b)语法:声明位置:声明在公有中 (本身为函数)
&&&&&&&&&&&&&&&&&&&&&&& 声明:friend&+&成员函数的声明
&&&&&&&&&&&&&&&&&&&&&&& 调用:先定义Y的对象y---使用y调用自己的成员函数---自己的成员函数中使用了友元机制
&&&&&&c)代码:&
void disp(girl &);
class girl
girl(char *N,int A);
friend void boy::disp(girl &); //声明类boy的成员函数disp()为类girl的友元函数
void boy::disp(girl &x)
cout&&&boy's name is:&&&name&&&,age:&&&age&&
//访问自己(boy)的对象成员,直接访问自己的私有变量
cout&&&girl's name is:&&&x.name&&&,age:&&&x.age&&
//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量
//正常情况下,只允许在girl的成员函数中访问girl的私有变量
void main()
b.disp(g);
4、在模板类中使用友元operator&&(对&&运算符的重载)
&&& a)使用方法:
在模板类中声明:
friend ostream& operator&& &&(ostream& cout,const MGraph&VexType,ArcType&& G);
在模板类中定义:
template&class VexType,class ArcType&
ostream& operator&&(ostream& cout,const MGraph&VexType,ArcType&& G)
//函数定义
&&&&b)注意:
把函数声明非模板函数:
friend ostream& operator&& (ostream& cout,const MGraph& G);
把函数声明为模板函数:
friend ostream& operator&& &&(ostream& cout,const MGraph&VexType,ArcType&& G);
friend ostream& operator&& &VexType,ArcType&(ostream& cout,const MGraph&VexType,ArcType&& G);
&在函数声明中加入operator&& &&:是将operator&&函数定义为函数模板,将函数模板申明为类模板的友员时,是一对一绑定的
&实际的声明函数:这里模板参数可以省略,但是尖括号不可以省略
friend ostream& operator&& &VexType,ArcType&(ostream& cout,const MGraph&VexType,ArcType&& G);
5、友元函数和类的成员函数的区别:成员函数有this指针,而友元函数没有this指针。
6、记忆:A是B的友元《=》A是B的朋友《=》借助B的对象,在A中可以直接 通过B。成员变量(可以是公有,也可以为私有变量) 的方式访问B&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:434434次
积分:6187
积分:6187
排名:第2628名
原创:207篇
转载:55篇
评论:190条
Java学习中,求交流,进步。
(10)(1)(7)(18)(32)(45)(29)(13)(1)(5)(7)(14)(14)(5)(1)(2)(3)(8)(2)(29)(16)

我要回帖

更多关于 请不吝赐教 的文章

 

随机推荐