C++友元的理解

一、友元形式:友元函数,友元类

二、先说友元类,假设有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<<"家庭住址:"<m_province<<"省"<m_city<<"市"<m_district<<"区"<
}

//实现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<m_name<<"的年龄是 "<m_age<<",成绩是 "<m_score< }

 注意看调用的时候,它不属于类的成员,因此可以直接用,即它是全局的

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;
}

你可能感兴趣的:(C++,基础语法总结,c++,开发语言)