一个类的友元类中的成员函数都是这个类的友元函数?

一个类的友元类中的成员函数都是这个类的友元函数?,第1张

友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数,但是他们调用的形式不同。
类的成员函数是属于类的,所以调用的时候是通过指针this调用的。
而类的友元函数不属于类,当然也不能有this指针了,也就是在友元函数中不能出现this指针。
同时友元函数是有关键字friend修饰。
再有的情况下,友元函数是很有用的。特别是在重载一些 *** 作符的时候用处很明显。

我的回答:友元函数显然是可以的,但是你说的头文件相互包含的问题是可以避免的
你在Book类里面声明Manage类的成员函数为友元函数,因此必然要包含Manage类的头文件,而且你最好使用提前声明,加一句class Manage;
你在Manage类里面的函数(声明为友元的函数),可以用的是Book类的声明,也就是只用声明class Book,不用包含头文件,因为在头文件中不需要展开具体的函数,因此不需要包含Book类的头文件,只需要在Manage类的cpp文件中包含Book类的头文件即可。

// testcpp : 定义控制台应用程序的入口点。
//
#include "stdafxh"
#include<iostream>//头文件
using namespace std;//命名空间
template <typename T>//模板
class A
{
public://外部接口
A(int x,T b[]);//构函数传入数据
void outputm_x();//输出边数
void outputx();//输出各边长
double c();//求周长
template <typename T,class C>//模板
friend double add(A<T> x,A<C> y);
~A(){};
private://数据成员
int m_x;//边数
double a[100];//各变长
};
template <typename T>
A<T>::A(int x,T b[])//成员函数实现
{
m_x=x; for(int i=0;i<m_x;i++)
{
a[i]=b[i];
}
}
template <typename T>
void A<T>::outputm_x()//成员函数实现
{
cout<<"边数为:"<<m_x<<endl;
}
template <typename T>
void A<T>::outputx()//成员函数实现
{
cout<<"各变长为:"<<endl;
for(int i=0;i<m_x;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
template <typename T>
double A<T>::c()//成员函数实现
{
double sum=0;
for(int i=0;i<m_x;i++)
{
sum=sum+a[i];
}
return sum;
}
template <typename T,class C>//模板
double add(A<T> x,A<C> y)
{
return xc()+yc();
}//友元函数求周长和
int main()
{
int x1=3,x2=4;//边数
int b1[100]={1,3,3};//多边形各变长
double b2[100]={21,31,42,5,5};//多边形各变长
A<int> A1(x1,b1);//创建类的对象A1并初始化
A<double> A2(x2,b2);//创建类的对象A2并初始化
A1outputm_x();//测试
A1outputx();//测试
cout<<"周长为:"<<A1c()<<endl;//测试
A2outputm_x();//测试
A2outputx();//测试
cout<<"周长为:"<<A2c()<<endl;//测试
cout<<"周长和为:"<<add(A1,A2)<<endl;//友元函数测试
return 0;
}


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

原文地址: https://outofmemory.cn/yw/12660282.html

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

发表评论

登录后才能评论

评论列表(0条)

保存