一个类构造函数能否声明为另一个类的友元函数

发布网友 发布时间:2022-04-01 16:06

我来回答

3个回答

热心网友 时间:2022-04-01 17:36

可以    将前类定义为后类的友元类即可

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。

friend<返回类型><函数名>(<参数列表>);

我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。

为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。

友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。

例如,以下语句说明类B是类A的友元类:

classA

{

public:

friendclassB;

};

经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

使用友元类时注意:

(1)友元关系不能被继承。

(2)友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。

(3)友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。下面举一例子说明友元函数的应用。

#include

#include

usingnamespacestd;

classPoint

{

public:

Point(doublexx,doubleyy){x=xx;y=yy;}

voidGetxy();

frienddoubleDistance(Point&a,Point&b);

private:

doublex,y;

};

voidPoint::Getxy()

{

cout<<"("<<<","<<<")"<

}

doubleDistance(Point&a,Point&b)

{

doubledx=a.x-b.x;

doubledy=a.y-b.y;

returnsqrt(dx*dx+dy*dy);

}

voidmain()

{

Pointp1(3.0,4.0),p2(6.0,8.0);

p1.Getxy();

p2.Getxy();

doubled=Distance(p1,p2);

cout<<"Distanceis"<<

}

说明:在该程序中的Point类中说明了一个友元函数Distance(),它在说明时前边加friend关键字,标识它不是成员函数,而是友元函数。它的定义方法与普通函数定义一样,而不同于成员函数的定义,因为它不需要指出所属的类。但是,它可以引用类中的私有成员,函数体中a.x,b.x,a.y,b.y都是类的私有成员,它们是通过对象引用的。在调用友元函数时,也是同普通函数的调用一样,不要像成员函数那样调用。本例中,p1.Getxy()和p2.Getxy()这是成员函数的调用,要用对象来表示。而Distance(p1,p2)是友元函数的调用,它直接调用,不需要对象表示,它的参数是对象。(该程序的功能是已知两点坐标,求出两点的距离。)

热心网友 时间:2022-04-01 18:54

#include <iostream>
using namespace std;
class B  //把B类放前面定义
{
private:
int c;
public:
void display();
};
class A
{
private:
int a;
void display()
{
cout<<"a="<<a<<endl;
}
public:
A(int b)  //构造函数是有参数的
{
a=b;
}
friend void B::display();
};

void B::display()
{
A aa(1);  //给个参数
aa.display();  //调用成员函数要A类的对象来调用
cout<<"this is class b"<<endl;
}

void main()
{
A a(2);  //缺个参数
B b;
b.display();
}

热心网友 时间:2022-04-01 20:28

友元函数:
作用:把其他类中函数作为自己的友员成员函数,让特定的类成员成为另一个类的友元函数,而不必让整个类成为友元,但在使用时,必须小心排列各种声明和定义顺序(且需用到向前声明)

但是我觉得不能让一个类的构造函数,成为另一个类的友元函数。
理由:
第一:即使能行,这件事本身也没有任何的意义。类本身就有构造函数,为什么还要定义其他类的构造函数呢?
第二:会导致代码阅读障碍吧。
有元函数的目的是只使用其他类的某个函数,而不必让整个类为友元。功能才是主要目的吧。
我是这么理解的,如果有不对的地方请多指教。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com