c++中的第三次作业
2019-09-26 17:23 myself914 阅读(152) 评论(0) 编辑 收藏 举报c++中的第三次作业
类的友元
首先看一个例子在:类b中内嵌了类a的对象,那么可不可通过b的成员函数访问a的私有成员:
#include<iostream>
using namespace std;
class A
{
public:
void setX()
{
cout<<x<<endl;
}
int getX()
{
return x;
}
private:
int x;
};
class B
{
public:
void set(int i);
void display();
friend class B;
private:
A a;
};
void B::set(int i)
{
a.x=i;
}
void B::display()
{
cout<<a.x<<endl;
}
int main()
{
B b;
b.set(10);
b.display();
return 0;
}
编译时却显示:
这样做是不能成功的,由此引入了友元关系:一个类主动声明哪些其他类或函数是它的朋友,进而给他们提供对本类的访问特许。友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
那么将上面那个例子用友元类改写一下:
#include<iostream>
using namespace std;
class A
{
public:
void setX()
{
cout<<x<<endl;
}
int getX()
{
return x;
}
friend class B;//加入友元关系
private:
int x;
};
class B
{
public:
void set(int i);
void display();
private:
A a;
};
void B::set(int i)
{
a.x=i;
}
void B::display()
{
cout<<a.x<<endl;
}
int main()
{
B b;
b.set(10);
b.display();
return 0;
}
此时的编译成功了,结果是:
友元函数
在友元函数的函数体中可以通过对象名访问类的私有和保护成员
例子:使用友元函数计算两点之间的距离
#include<iostream>
using namespace std;
class Point
{
public:
Point(int x=0,int y=0):x(x),y(y){}
int getX()
{
return x;
}
int getY()
{
return y;
}
friend float dist(Point &p1,Point &p2);
private:
int x,y;
};
float dist(Point &p1,Point &p2)
{
double x=p1.x-p2.x;//通过对象名直接访问私有成员
double y=p1.y-p2.y;
return static_cast<float>(sqrt(x*x+y*y));
}
int main()
{
Point myp1(1,1),myp2(4,5);
cout<<"The distance is:"<<endl;
cout<<dist(myp1,myp2)<<endl;
return 0;
}
运行结果是:
可以看到在友元函数中通过对象名直接访问了Point类中的私有数据成员x和y。
注意:
友元关系是不能传递的;友元关系是单向的;友元关系是不能被继承的。