共计 2326 个字符,预计需要花费 6 分钟才能阅读完成。
本例对 C ++ 友元的使用从代码上作了一个简单的归纳,但不仅限于本问讲到的用法,友元还可以重载等。
**
/ 全局函数作为友元 /
**
include <iostream>
include <cmath>
using namespace std;
class Point{
public:
Point(double x, double y){
_x = x;
_y = y;
}
void getFormatxy();
friend double distance(Point &a, Point &b);
private:
double _x, _y;
};
void Point::getFormatxy(){
cout<<"("<<_x<<","<<_y<<")"<<endl;
}
double distance(Point &a, Point &b){
double dx = a._x - b._x;
double dy = a._y - b._y;
return sqrt(dx*dx + dy*dy);
}
int main()
{
Point p1(3.0, 4.0), p2(6.0, 8.0);
p1.getFormatxy();
p2.getFormatxy();
double d = distance(p1, p2);
cout<<"distance is"<<d<<endl;
return 0;
}
**
/ 一个类的成员函数作友元 /
**
include <iostream>
include <cmath>
using namespace std;
class Point; // 前向声明, 用于声明。
class ManagerPoint{
public:
double distance(Point &a, Point &b);
};
class Point{
public:
Point(double x, double y){
_x = x;
_y = y;
}
void getFormatxy();
friend double ManagerPoint::distance(Point &a, Point &b);
private:
double _x, _y;
};
void Point::getFormatxy(){
cout<<"("<<_x<<","<<_y<<")"<<endl;
}
double ManagerPoint::distance(Point &a, Point &b){
double dx = a._x - b._x;
double dy = a._y - b._y;
return sqrt(dx*dx +dy*dy);
}
int main()
{
Point p1(3.0, 4.0), p2(6.0, 8.0);
p1.getFormatxy();
p2.getFormatxy();
ManagerPoint mp;
float d = mp.distance(p1, p2);
cout<<"distance is"<<d<<endl;
return 0;
}
**
/ 友元类 /
**
include <iostream>
include <cmath>
using namespace std;
class Point{
public:
friend class ManagerPoint;
Point(double x, double y){
_x = x;
_y = y;
}
void getFormatxy();
private:
double _x, _y;
};
void Point::getFormatxy(){
cout<<"("<<_x<<","<<_y<<")"<<endl;
}
class ManagerPoint{
public:
double distance(Point &a, Point &b);
};
double ManagerPoint::distance(Point &a, Point &b){
double dx = a._x - b._x;
double dy = a._y - b._y;
return sqrt(dx*dx + dy*dy);
}
int main()
{
Point p1(3.0, 4.0), p2(6.0, 8.0);
p1.getFormatxy();
p2.getFormatxy();
ManagerPoint mp;
float d = mp.distance(p1, p2);
cout<<"distance is"<< d<<endl;
return 0;
}
**
/ 友元小结 /
**
// 友元声明以关键字 friend 开始, 它只能出现在类定义中
// 因为友元不是类授权的成员, 所以它不受其所在区域的 public private 和 protected 的影响
// 通常, 把所有友元声明组织在一起并放在类头之后.
// 友元利弊:
// 友元不是类成员, 但是它可以通过对象访问类中的私有成员, 友元的作用在于提高程序的运行效率
// 但是, 它破坏了封装性, 使得非成员函数可以访问类的私有成员
// 注意: 友元关系不能被继承, 友元关系不具有传递性
include <iostream>
using namespace std;
class Time{
public:
friend class Watch;
Time(int hour, int min, int sec){
m_iHour = hour;
m_iMinute = min;
m_iSecond = sec;
}
private:
int m_iHour;
int m_iMinute;
int m_iSecond;
};
class Watch{
public:
Watch(Time t): m_tTime(t){}
void display(){
cout<<m_tTime.m_iHour<<endl;
cout<<m_tTime.m_iMinute<<endl;
cout<<m_tTime.m_iSecond<<endl;
}
public:
Time m_tTime;
};
int main()
{
Time t(6, 30, 20);
Watch w(t);
w.display();
return 0;
}