1. 程式人生 > >c++友元的幾種情況

c++友元的幾種情況

一、友元類

對於一個類的私有成員,只有該類的成員函式才能訪問,其他類訪問不了。友元類就是希望另外一個類能夠訪問當前類的私有成員,這樣就可以在當前類中宣告一個友元類。程式碼如下:

#include <iostream>
using namespace std;
class A
{
private:
	int num;
public:
	A():num(0){cout << "A預設建構函式"<<endl;}
	A(int tmp){num = tmp;cout << "A建構函式"<<endl;}
	~A(){cout << "A解構函式"<< endl;}
	friend class B;
};
class B
{
public:
	B():b(0){cout << "B預設建構函式"<<endl;}
	B(int i):b(i){cout << "B建構函式"<<endl;}
	~B(){cout << "B解構函式"<<endl;}
	void display()
	{
		
		cout <<"B:" << b.num << endl;
	}
private:
	A b;
};
int main(void)
{
	B c(1);
	c.display();
	return 0;
}

二 、友元方法

如果一個類只想讓其中一個方法訪問另外一個類的私有成員,那麼就可以在另外一個類中宣告友元類

程式碼如下:

#include <iostream>
using namespace std;
class A;
class B
{
private:
	A *b; 
public:
	B();
	~B();
	void display();
};
class A
{
private:
	int num;
public:
	A():num(0){cout << "A預設建構函式"<<endl;}
	A(int tmp){num = tmp;cout << "A建構函式"<<endl;}
	~A(){cout << "A解構函式"<< endl;}
	friend void B::display();
	
};
B::B()
{
	b = new A(10);
	cout << "B預設建構函式"<<endl;
}
B::~B()
{
	delete b;
	cout << "B解構函式"<<endl;
}
void B::display()
{
	cout << b->num << endl;
}

int main(void)
{
	B c;
	c.display();
	return 0;
}

三、外部成員函式宣告為友元

1、如果一個全域性函式想訪問一個類中的私有成員那麼他可以通過在該類中宣告為友元,這樣就可以訪問了程式碼如下:

#include <iostream>
using namespace std;
class A
{
private:
	int num;
public:
	A():num(0){cout << "預設建構函式"<<endl;}
	A(int tmp){num = tmp;cout << "建構函式"<<endl;}
	~A(){cout << "解構函式"<< endl;}
	 friend void print(A&);
};
void print(A&a)
{
	cout << a.num <<endl;
}

int main(void)
{
	A a(100);
	print(a);
	return 0;
}

2、如果在類中定義一個友元函式效果是和在外面定義是一樣的程式碼如下:

#include <iostream>
using namespace std;
class A
{
private:
	int num;
public:
	A():num(0){cout << "預設建構函式"<<endl;}
	A(int tmp){num = tmp;cout << "建構函式"<<endl;}
	~A(){cout << "解構函式"<< endl;}
	friend void print(A&a) 
	{
		cout << a.num <<endl;
	}
};
int main(void)
{
	A a(100);
	print(a);
	return 0;
}