#define _CRT_SECURE_NO_WARNINGS
#include <iostream>//include <>表示引用的是编译器类库路径里面的头文件,一般引用系统文件
#include "math.h"//include ""表示引用的是你项目当前目录里的头文件,一般引用自己定义的头文件,如果使用""时,编译器会现在你项目的当前路径查找对应头文件,如果没有再去系统类库里去查找
using namespace std;
class Distance
{
public:
//友元函数只是一个声明,声明这个函数为这个类的友元函数,友元函数的声明在类的哪里都可以,一般写在方法的最前面,表示下面这个函数为我这个类的友元函数,可以直接调用类里的私有成员变量
friend double pointDistance(Distance a, Distance b);
//声明友元类,友元类里的方法可以直接调用这个类里的私有变量,即谁含有友元类,谁的私有成员变量就可以变友元类直接调用
//1.友元具有单向性,Test是Distance的友元类,但Distance不是Test的友元类
//2.友元不具有传递性,若类B时类A的友元,类C是类B的友元,但类C不是类A的友元
//3.友元不能被继承,子类继承父类,但不继承友元,即B是A的子类,C是A的友元,但C不是B的友元
//总结:友元是完全独立的,仍和传递都不行,需要包含一个友元只能在类里自己声明
friend class Test;
Distance(int x, int y)
{
this->x = x;
this->y = y;
}
private:
int x;
int y;
};
//友元函数的优点:可以直接调用类里的私有成员变量,减少函数压栈出栈的开销
//友元函数的缺点:破坏了类的封装性和隐藏性,使非成员函数可以访问类的私有成员
double pointDistance(Distance a, Distance b)
{
double distance;
distance = sqrt((b.x - a.x)*(b.x - a.x) + (b.y - a.y)*(b.y - a.y));
return distance;
}
class Test
{
public:
Test(int a, int b)
{
this->a = a;
this->b = b;
}
void printXY()
{
Distance distance(1, 2);
cout << "x=" << distance.x << "y=" << distance.b << endl;
}
private:
int a;
int b;
//注意私有成员变量里有没别的类的对象,因此这与函数初始化列表完全不同,虽然这里类也有别的类的对象,但别的类的对象在类的方法中,初始化时并不需要创建别的类的对象
};
int main()
{
Distance a(1, 2);
Distance b = Distance(2, 3);
pointDistance(a, b);
return 0;
}