c/c++基础(十九) 友元

2015-01-27 05:59:52 · 作者: · 浏览: 3

概念的东西不讲了,直接上代码:


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
  
   
#include
   
     using namespace std; Point::Point(double x,double y) { this->x=x; this->y=y; } Point::~Point(void) { } void Point::getXY() { cout<<"x: "<
    
     
测试文件TestProject.cpp:

#include "stdafx.h"
#include "Point.h"
#include 
      
       
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 : "<
       
        
输出:

\


二,友元类:


类A的声明与定义:

<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHByZSBjbGFzcz0="brush:java;">#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
       
        
#include
        
          using namespace std; A::A(double x,double y) { this->x=x; this->y=y; } A::~A(void) { } void A::getXY() { cout<<"A x: "<
         
          
类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 
           
            
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
           
            
#include
            
              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: "<
             
              
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 
               
                
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;
}
               

打印结果:

html

http://baike.baidu.com/view/1066547.htm?fr=aladdin

http://www.cnblogs.com/uniqueliu/archive/2011/08/02/2125590.html