ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++友元函数和友元类详解

2021-12-18 09:30:00  阅读:170  来源: 互联网

标签:友元 函数 c++ char score Student Address 友元类 name


/* c++友元函数和友元类详解 */
/* 只有本类中的函数可以访问本类的 private 成员,借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数(普通函数?)访问当前类的 private 成员*/
/* 友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的 */
/* 在类外定义,在类中声明,不属于当前类的函数,前面加上friend关键字构成友元函数,友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数 */

/*1、将非成员函数声明为友元函数 */
#include <iostream>
using namespace std;
namespace LL
{
    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 main0()
{
    LL::Student stu("小明", 15, 90.6);
    LL::show(&stu); //调用友元函数
    LL::Student *pstu = new LL::Student("李磊", 16, 80.5);
    LL::show(pstu); //调用友元函数
    return 0;
}

/* 2、将其他类的成员函数声明为友元函数 */
/* 一个函数可以被多个类声明为友元函数,这样就可以访问多个类中的 private 成员 */
namespace LL1
{

    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 main1()
{
    LL1::Student stu("小明", 16, 95.5f);
    LL1::Address addr("陕西", "西安", "雁塔");
    stu.show(&addr);

    LL1::Student *pstu = new LL1::Student("李磊", 16, 80.5);
    LL1::Address *paddr = new LL1::Address("河北", "衡水", "桃城");
    pstu->show(paddr);
    return 0;
}

/* 3、友元类 */
/* 友元类中的所有成员函数都是另外一个类的友元函数 */
/* 友元的关系是单向的而不是双向的。如果声明了类 B 是类 A 的友元类,不等于类 A 是类 B 的友元类 */
/* 友元的关系不能传递。如果类 B 是类 A 的友元类,类 C 是类 B 的友元类,不等于类 C 是类 A 的友元类。 */
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;
}

标签:友元,函数,c++,char,score,Student,Address,友元类,name
来源: https://blog.csdn.net/weixin_43445441/article/details/122008518

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有