C++之友元成員

CYH00_發表於2020-12-03

友元成員分類:

1.友元函式

如果把一個獨立函式說明為類的友元,則該函式成為類的友元函式,友元函式可以訪問類的私有變數。
一般模板為:friend 函式原型宣告;示例如下:

#include <iostream>
using namespace std;
class student{
	private:
		int id,score;
		char *name;
	public:
		void play_information();//顯示學生學號、姓名、成績
		friend void set_inform(student &stu,int id,char *name,int score);//友元函式說明
};
void student::play_information()
{
	cout<<"學號:"<<id<<'\t'<<"姓名:"<<name<<'\t'<<"成績:"<<score<<endl;
}
void set_inform(student &stu,int id,char *name,int score)//學生資訊錄入
{
	stu.id = id;
	stu.name = name;
	stu.score = score;
}
void main()
{
	student stu;
	set_inform(stu,1001,"陳  紅",100);
	stu.play_information();
}
執行結果:學號:1001      姓名:陳  紅    成績:100

程式說明:在本例中,獨立函式set_inform(student &stu,int id,char *name,int score)即為友元函式,可以訪問物件stu的私有變數。

2.友元成員函式

友元成員函式是類之間而言的,即一個類teacher中的成員函式在另一個類student中被宣告為友元,則該函式被稱為友元成員函式,且類teacher中的該函式可以訪問student中的成員變數。
一般模板為:friend 返回值型別 所屬類名::函式名(引數);示例如下:

#include <iostream>
using namespace std;
class student;
class teacher{
public:
	void set_inform(student &stu, int id, char *name, int score);
	void show_inform(student stu);
};

class student{
private:
	int id, score;
	char *name;	
public:
	friend void teacher::set_inform(student &stu, int id, char *name, int score);//友元成員函式說明
	friend void teacher::show_inform(student stu);//友元成員函式說明
};

void teacher::set_inform(student &stu, int id, char *name, int score)
{
	stu.id = id;
	stu.name = name;
	stu.score = score;
}
void teacher::show_inform(student stu)
{
	cout << "學號:" << stu.id << '\t' << "姓名:" << stu.name << '\t' << "成績:" << stu.score << endl;
}

void main()
{
	student stu;
	teacher teach;
	teach.set_inform(stu, 1002, "張大山", 99);
	teach.show_inform(stu);
}
執行結果:
	學號:1002      姓名:張大山    成績:99

程式說明:在本例中teacher中的兩個成員函式set_inform(student &stu, int id, char *name, int score)show_inform(student stu)都在student中被宣告為友元,因此這兩個函式都是友元函式,均可訪問student中的私有成員變數。
注:友元成員函式在visual2013中會出現問題,表現在IntelliSense顯示紅色波浪線的警告,友元成員函式在定義過程中呼叫另一個類的私有變數時顯示警告,如stu.id = id; stu.name = name; stu.score = score;均會有紅色波浪線提示不可訪問,但是並不影響程式的正常編譯,也就是程式可以執行。(很多教材中並沒有提及友元成員函式,我想這裡示例中的IntelliSense波浪線警告可以看出這種寫法不太合適,後來百度上某位大佬指點說是微軟不支援這種寫法,具體原因見:https://zhidao.baidu.com/question/1303726966589368499.html

3.友元類

友元類是兩個類之間的關係,若某一類teacher是另一個類student的友元,則類teacher中的成員函式可以訪問student類中的變數。
一般模板為:friend class 類名;示例如下:

#include <iostream>
class student{
private:
	int id, score;
	char *name;
	friend class teacher;//宣告友元類 teacher
};

class teacher{
private:
	
public:
	void set_score(student &stu);
	void play_score(student &stu);
};

void teacher::set_score(student &stu)
{
	char *na = new char[20];//動態申請空間
	int d, x;
	std::cout << "please enter the information:";
	std::cin >> d >> na >> x;//依次輸入學號、姓名、成績
	stu.id = d;
	stu.name = na;
	stu.score = x;
}

void teacher::play_score(student &stu)
{
	std::cout << "學號\t" << "姓名\t" << "成績" << std::endl;
	std::cout << stu.id << '\t' << stu.name << '\t' << stu.score << std::endl;
}

void main()
{
	student stu;
	teacher t;
	t.set_score(stu);
	t.play_score(stu);
}
執行結果:
	please enter the information:1001 陳紅 100
	學號    姓名    成績
	1001    陳紅    100

程式說明:teacher類是student的友元類,所以teacher類中的兩個成員函式都可以訪問student中的變數並對所申明的相關物件進行定義操作。

相關文章