C++友元函数与友元类的用法

1.友元函数

一般情况下,外部的函数无法访问类的私有成员变量


#include "mainwindow.h"
#include <QApplication>
#include <windows.h>

class A
{
   MainWindow p;
   int x;
   int y;
   
};

void move(class A & myA)
{
    myA.p.resize(300,300);
    for(int i=0;i<5;i++)
    {
        myA.x=i*100;//会报错,提示不能访问class A的私有成员变量
        myA.y=i*100;//
        myA.p.move(myA.x,myA.y);//
        myA.p.show();//
        Sleep(2000);//

    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    A myA;
    move(myA);


    return a.exec();
}
很显然,得到结果是程序无法执行

但是作为以一个外部的函数move如果想访问某个类怎么办呢?可以把move函数在这个类里声明为友元函数。


#include "mainwindow.h"
#include <QApplication>
#include <windows.h>

class A
{
   MainWindow p;
   int x;
   int y;
   friend void move(class A & myA);//声明为友元函数
};

void move(class A & myA)
{
    myA.p.resize(300,300);
    for(int i=0;i<5;i++)
    {
        myA.x=i*100;//这时候可以访问,程序执行正确
        myA.y=i*100;
        myA.p.move(myA.x,myA.y);
        myA.p.show();
        Sleep(2000);

    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    A myA;
    move(myA);


    return a.exec();
}


2.友元类


既然一个外部的函数可以通过友元函数的概念实现对类的私有成员变量的访问,那么作为一个类能不能通过访问另一个类的私有数据实现某些功能呢?我们可以通过友元类实现。


#include "mainwindow.h"
#include <QApplication>
#include <windows.h>

class A
{
   MainWindow p;
   int x;
   int y;
  
};

class B
{
    A myA;
public:
    B()
    {
        myA.p.resize(200,200);//
        for(int i=0;i<5;i++)
        {
            myA.x=i*100;//x是私有的,此时程序无法执行
            myA.y=i*100;//
            myA.p.move(myA.x,myA.y);//
            myA.p.show();//
            Sleep(2000);
        }
        return;

    }


};



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    B myB;
    return a.exec();
}



就像在类中声明友元函数一样,我们在class A中声明class B 为友元类。


#include "mainwindow.h"
#include <QApplication>
#include <windows.h>

class A
{
   MainWindow p;
   int x;
   int y;
   friend class B;
};

class B
{
    A myA;
public:
    B()
    {
        myA.p.resize(200,200);
        for(int i=0;i<5;i++)
        {
            myA.x=i*100;//可以访问,程序正确执行
            myA.y=i*100;
            myA.p.move(myA.x,myA.y);
            myA.p.show();
            Sleep(2000);
        }
        return;

    }


};



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    B myB;
    return a.exec();
}




你可能感兴趣的:(C++友元函数与友元类的用法)