当前位置:首页 > 编程笔记 > 正文
已解决

C++友元的理解

来自网友在路上 173873提问 提问时间:2023-11-20 21:26:19阅读次数: 73

最佳答案 问答题库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 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!