本例对C++友元的使用从代码上做了一个简单的概括,但不只限于本问讲到的用法,友元还能够重载等。
**ios
/全局函数做为友元/函数
**spa
using namespace std;code
class Point{
public:orm
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(){get
cout<<"("<<_x<<","<<_y<<")"<<endl;
}
double distance(Point &a, Point &b){io
double dx = a._x - b._x; double dy = a._y - b._y; return sqrt(dx*dx + dy*dy);
}class
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;
}
**
/一个类的成员函数做友元/
**
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;
}
**
/友元类/
**
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 的影响
//一般,把全部友元声明组织在一块儿并放在类头以后.
//友元利弊:
//友元不是类成员,可是它能够经过对象访问类中的私有成员,友元的做用在于提升程序的运行效率
//可是,它破坏了封装性,使得非成员函数能够访问类的私有成员
//注意: 友元关系不能被继承,友元关系不具备传递性
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;
}