?友元friend在c++中的應用?
我們知道在c++的類訪問權限中,private和 protected在類外面進行訪問的時候 會因為權限而不能訪問?,友元就解決了這個問題 。
可以這樣理解,他為外部的 函數 或者類 進行了 訪問授權,其實這已經超出OOP的范疇,但是對于C++而言是以實用為主,所以說C++并不是完全面向對象的語言
C++這一特性就破壞的C++的安全性 。
我們要使用友元函數或者類 我們就要在類的定義中用 friend 進行相應的聲明 。。。
?
下面是友元函數的利用 ,我們利用友元函數進行對于類的私有成員和保護成員進行修改
#include <iostream>
using namespace std ;
class? A
{
public:
?A()
?{
??this->x=0;
??this->y=0 ;
?}
?void Show()
?{
??cout<<"x="<<this->x<<endl;
??cout<<"y="<<this->y<<endl;
?}
?friend void Add(A*) ;
private:
?int x ;
protected:
?int y;
};
void Add(A* a)
{
?a->x++;
?a->y++;
}
void main()
{
??? A * a=new A() ;
?Add(a) ;
?a->Show() ;
}
?下面是利用對于內部類進行授權進行訪問,對于內部類來說我們 在類內部聲明,但是并沒有賦予內部類訪問包容類私有成員的權限所以我們要利用friend將內部類聲明
為全局. 注意在java中 內部類是具有訪問外部類的權限的 。
#include <iostream>
using namespace std ;
class A
{
private:
? int x ;
public :
?A()
?{
??this->x=0 ;
?}
?class B
?{
?public:
??void add(A *tem)
??{
?? tem->x++;
??}
?};
?friend A::B ;??? //對內部類進行全局聲明
?void show()
?{
???? cout<<"x="<<this->x<<endl ;
?}
?
};
void main()
{
?A::B c ;???
?A a ;
?c.add(&a);
??? a.show();
}
3、利用友元類進行訪問
#include <iostream>
using namespace std ;
class A
{
public:
?A()
?{
??x=0 ;
?}
?void show()
?{
??cout<<"x="<<x<<endl ;
?}
?friend? class? B ;
private:
?int x ;
};
class? B
{
public:
?A a ;
?void add()
?{
??a.x++ ;
?}
};
void main()
{
?B? b;
?b.add() ;
?b.a.show() ;
}
?