C++为啥为啥 friend void g(X*)不会报错 friend void Y::g(X*x)会错

C++为啥为啥 friend void g(X*)不会报错 friend void Y::g(X*x)会错,第1张

您这个是概念理解问题:

friend关键字是在类定义时声明一个独立于当前类的外部函数为友元函数时作语义修饰用的。友元型函数既可以是普通函数也可以是其他类的成员函数(友元成员),有两种形式:

class A{

void bmf(){};

friend void B:: amf();//将B类的成员函数声明为本类的友元成员,需域运算符限定amf()属B类

friend void g();//声明g为友元函数

};

void g(){}//g定义是个外部的普通函数,不需要域限定符

1

The

initial

weight

of

goods:

0

The

total

weight

of

goods:

85

2

v1

=

(2,2)

v2

=

(5,4)

v3

=

v1

+

v2

=

(7,6)

3

n

=

1,

X

=

12

n

=

2,

X

=

34

n

=

1

想让某函数能访问某类的私有成员的时候,把该函数声明为友元,声明方式是在被访问的类声明里声明该函数。

template <class T>

ostream & operator << (ostream &os, const MyList <T> & l)

{

ListNode<T> current = MyList <T> head;

while (NULL != current)

{

cout << current -> data >> " ";

current = current -> next;

}

return ostream;

}

扩展资料:

假设f是想正确声明的函数,c是和它相关的类:

虚函数必须是成员函数。如果f必须是虚函数,就让它成为c的成员函数。

operator>>;和operator<<;决不能是成员函数。如果f是operator>>;或operator<<;,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。

只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。

参考资料来源:-友元函数

我这学期学了C++,对友元和友元函数有一点认识,提供以下内容,仅供参考。

(1)友元的来历

根据类的封装性,一般将数据成员声明为私有成员,在外部不能直接访问它,只能通过类的公有成员函数对私有成员进行访问。有时,需要频繁调用成员函数来访问私有成员,这样系统开销就比较大。C++从高效的角度出发,提供了友元机制,使被声明为友元的全局函数或者其他类可以直接访问当前类中的私有成员,又不改变其私有成员的访问权限。

(2)友元的作用

友元不是类的成员函数,但能直接访问类的所有成员,又不改变受访问类成员的访问权限,避免了频繁调用类的成员函数。使用友元可以节约开销,提高程序的效率。

(3)友元不一定是全局函数

友元可以是一个全局函数,也可以是一个类的成员函数,还可以是一个类。如果友元是函数,则称为友元函数。如果友元是一个类,则称为友元类。友元类的所有成员函数都是友元函数,可以访问被访问类的所有成员。友元不是被访问类的成员,所以它不受类的访问权限(public、private、protected)影响。友元声明以关键字friend开始,注意只能出现在被访问类的定义中。

不充一点:友元不是纯面向对象的,那是因为友元并非被访问类的成员却可以任意修改类的私有成员,破坏了类的封装性。

C++有点高深,好好学吧~~~~

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12163589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存