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

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);
}

#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;
}

#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;
}

#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;
}

• 本文已收录于以下专栏：

## C++基础-友元专题

• 2012-03-03 18:14
• 152KB
• 下载

## 友元类（C++基础教学）

• 2012-04-22 13:57
• 4.66MB
• 下载

## 【C++基础之十】友元函数和友元类

1.概述 友元提供了一种 普通函数或者类成员函数 访问另一个类中的私有或保护成员 的机制。也就是说有两种形式的友元： （1）友元函数：普通函数对一个访问某个类中的私有或保护成员。 （2）友元类：类A中...

## C++基础---友元类

1. 友元类 1.1 友元类的概念 友元类：与函数相同，类也可以作为另一个类的友元类，这样，另一个类的私有及其保护成员都会暴露给友元类。 友元类：可以通过自己的方法来访问另一个类的所有成员。但是这...

## 【C++基础 05】友元函数和友元类

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)