友元函數:
需要友元的原因:
1:普通函數需要直接通路一個類的保護或私有資料成員
2:需要友元的另一個原因是為了友善重載操作符的使用
友元函數不是成員函數,它是類的朋友,因而能夠通路類的全部成員
在類的内部,隻能聲明它的函數原型,加上friend 關鍵字
優缺點:
優點:能夠提高效率,表達簡單,清晰
缺點:友元函數破壞了封裝機制,盡量不使用成員函數,除非不得已的情況下才使用友元函數。
友元函數和普通成員函數差別:
成員函數有this指針,而友元函數沒有this指針
友元函數是不能被繼承的,就像父親的朋友未必是兒子的朋友。
類為友元:
#include<iostream>
using namespace std;
class Student
{
int student_id;
public:
Student(int x):student_id(x){}
friend class Teacher; <span style="color:#ff0000;">//為Teacher友元,所有Teacher可以通路所有student裡面東西</span>
};
class Teacher
{
int teacher_id;
public:
Teacher(int x):teacher_id(x){};
void show_student(const Student& a ) <span style="color:#cc0000;">//在此進行對student的通路</span>
{
cout<<"student_id:"<<a.student_id<<endl;
}
};
int main()
{
Student s1(201501);
Teacher t1(1);
t1.show_student(s1); //列印
return 0;
}
普通函數為友元:
#include<iostream>
using namespace std;
class Student
{
int student_id;
public:
Student(int x):student_id(x){}
friend void fn(const Student& a); <span style="color:#ff0000;">//申明友元函數</span>
};
void fn(const Student& a)
{
cout<<a.student_id<<endl; <span style="color:#ff0000;"> //對其進行使用</span>
return ;
}
int main()
{
Student s1(201501);
fn(s1);
return 0;
}