概念的东西不讲了,直接上代码:
1.友元函数:
Point.类的声明与定义:
#pragma once
#ifndef _POINT_H
#define _POINT_H
class Point
{
public:
void getXY();
friend double distanceXY(Point &a,Point &b);
public:
Point(double x,double y);
~Point(void);
private:
double x;
double y;
};
#endif
#include "stdafx.h"
#include "Point.h"
#include<cmath>
#include<iostream>
using namespace std;
Point::Point(double x,double y)
{
this->x=x;
this->y=y;
}
Point::~Point(void)
{
}
void Point::getXY()
{
cout<<"x: "<<x<<" y: "<<y<<endl;
}
double distanceXY(Point &a,Point &b)
{
double dx=a.x-b.x;
double dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
测试文件TestProject.cpp:
#include "stdafx.h"
#include "Point.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Point p1(3.0,4.0),p2(5,6);
p1.getXY();
p2.getXY();
double dis=distanceXY(p1,p2);
cout<<"distance is : "<<dis<<endl;
return 0;
}
输出:
二,友元类:
类A的声明与定义:
#pragma once
class A
{
public:
void getXY();
friend class B;
public:
A(double x,double y);
~A(void);
private:
double x;
double y;
};
#include "stdafx.h"
#include "A.h"
#include<cmath>
#include<iostream>
using namespace std;
A::A(double x,double y)
{
this->x=x;
this->y=y;
}
A::~A(void)
{
}
void A::getXY()
{
cout<<"A x: "<<x<<" y: "<<y<<endl;
}
类B的声明与定义:
#pragma once
#include "A.h"
class B
{
public:
B(void);
~B(void);
public:
void setX(A &a);
void setY(A &b);
};
#include "stdafx.h"
#include "B.h"
B::B(void)
{
}
B::~B(void)
{
}
void B::setX(A &a)
{
a.x=0;
a.getXY();
}
void B::setY(A &a)
{
a.y=0;
a.getXY();
}
测试类如下:
#include "stdafx.h"
#include "A.h"
#include "B.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
A a(5.0,5.0);
B b;
b.setX(a);
b.setY(a);
return 0;
}
结果如下:
三:友元是类的成员函数
M文件声明与定义:
#pragma once
#ifndef _M_H
#define _M_H
#include "N.h"
class M
{
public:
void getXY();
friend void N::print(M& m);
public:
M(double x,double y);
~M(void);
private:
double x;
double y;
private:
void getXY2();
};
#endif
#include "stdafx.h"
#include "M.h"
#include<cmath>
#include<iostream>
using namespace std;
M::M(double x,double y)
{
this->x=x;
this->y=y;
}
M::~M(void)
{
}
void M::getXY()
{
cout<<"M getXY x: "<<x<<" y: "<<y<<endl;
}
void M::getXY2()
{
cout<<"我是M中的私有方法"<<endl;
}
N的声明与定义:
#pragma once
#ifndef _N_H
#define _N_H
class M;
class N
{
public:
N(void);
~N(void);
public:
void print(M &m);
void print2(M &m);
};
#endif
#include "stdafx.h"
#include "N.h"
#include "M.h"
N::N(void)
{
}
N::~N(void)
{
}
void N::print(M &m)
{
m.getXY();
m.getXY2();
}
void N::print2(M &m)
{
//m.getXY();//--------这里如果打开注释会报错
//m.getXY2();
}
测试类:
#include "stdafx.h"
#include "M.h"
#include "N.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
M m(5.0,5.0);
N n;
n.print(m);
n.print2(m);
return 0;
}
打印结果:
参考文章:http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html
http://baike.baidu.com/view/1066547.htm?fr=aladdin
http://www.cnblogs.com/uniqueliu/archive/2011/08/02/2125590.html