C++友元的理解
最佳答案 问答题库738位专家为你答疑解惑
一、友元形式:友元函数,友元类
二、先说友元类,假设有A,B类,在B中声明A类为友元,那么A就可以访问B中的任意成员,
说明一下,也不是通过A直去访问B,其实还是B直接去访问,不用写Get,Set等函数,通过点号访问,不过是在A的成员函数中实现,这就是友元的作用,我的理解是省去属性代码的编写,又对外(其他对象屏闭实现)
比较经典的代码(摘录)
#include <iostream>
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<<m_name<<"的年龄是 "<<m_age<<",成绩是 "<<m_score<<endl;
cout<<"家庭住址:"<<addr->m_province<<"省"<<addr->m_city<<"市"<<addr->m_district<<"区"<<endl;
}
//实现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 <iostream>
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<<pstu->m_name<<"的年龄是 "<<pstu->m_age<<",成绩是 "<<pstu->m_score<<endl;
}
注意看调用的时候,它不属于类的成员,因此可以直接用,即它是全局的
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 <iostream>
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_name<<"的年龄是 "<<m_age<<",成绩是 "<<m_score<<endl;cout<<"家庭住址:"<<addr->m_province<<"省"<<addr->m_city<<"市"<<addr->m_district<<"区"<<endl;
}//实现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;
}
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"C++友元的理解":http://eshow365.cn/6-40640-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: redis三种集群方式
- 下一篇: 21、嵌套路由实战操作