一、友元形式:友元函数,友元类
二、先说友元类,假设有A,B类,在B中声明A类为友元,那么A就可以访问B中的任意成员,
说明一下,也不是通过A直去访问B,其实还是B直接去访问,不用写Get,Set等函数,通过点号访问,不过是在A的成员函数中实现,这就是友元的作用,我的理解是省去属性代码的编写,又对外(其他对象屏闭实现)
比较经典的代码(摘录)
#include
using namespace std;
class Address; //提前声明Address类
//声明Student类
class Student{
public:
Student(char *name, int age, float score);
public:
void show(Address *addr);
private:
char *m_name;
int m_age;
float m_score;
};
//声明Address类
class Address{
public:
Address(char *province, char *city, char *district);
public:
//将Student类声明为Address类的友元类
friend class Student;
private:
char *m_province; //省份
char *m_city; //城市
char *m_district; //区(市区)
};
//实现Student类
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
void Student::show(Address *addr){
cout<
cout<<"家庭住址:"<
}
//实现Address类
Address::Address(char *province, char *city, char *district){
m_province = province;
m_city = city;
m_district = district;
}
int main(){
Student stu("小明", 16, 95.5f);
Address addr("陕西", "西安", "雁塔");
stu.show(&addr);
Student *pstu = new Student("李磊", 16, 80.5);
Address *paddr = new Address("河北", "衡水", "桃城");
pstu -> show(paddr);
return 0;
}
三、友元函数:
与友元类用法差不多,它又分两种情况:
1:非成员函数声明为友元,直接访问类的私有成员:
#include
using namespace std;
class Student{
public:
Student(char *name, int age, float score);
public:
friend void show(Student *pstu); //将show()声明为友元函数
private:
char *m_name;
int m_age;
float m_score;
};
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
//非成员函数
void show(Student *pstu){
cout<
注意看调用的时候,它不属于类的成员,因此可以直接用,即它是全局的
int main(){
Student stu("小明", 15, 90.6);
show(&stu); //调用友元函数
Student *pstu = new Student("李磊", 16, 80.5);
show(pstu); //调用友元函数
return 0;
}
2:将其他类的成员函数声明为友元函数:
假设现有的两个类A,B,都已经定义好了,A中有一个函数需要访问到B中的成员作参数,为了省去属性,在A中声明这个函数的同时,在B中也声明一遍,就可以了直接访问了,
访问调用方式跟上面是一样的:
#include
using namespace std;
class Address; //提前声明Address类
//声明Student类
class Student{
public:
Student(char *name, int age, float score);
public:
void show(Address *addr);
private:
char *m_name;
int m_age;
float m_score;
};
//声明Address类
class Address{
private:
char *m_province; //省份
char *m_city; //城市
char *m_district; //区(市区)
public:
Address(char *province, char *city, char *district);
//将Student类中的成员函数show()声明为友元函数
friend void Student::show(Address *addr);
};
//实现Student类
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
void Student::show(Address *addr){
cout<m_province<<"省"<m_city<<"市"<m_district<<"区"< show(paddr);
return 0;
}