c++友元函数和友元类

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

猜你喜欢

转载自blog.csdn.net/tulipless/article/details/80572960