ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

友元函数的使用方式

2021-04-07 20:31:21  阅读:197  来源: 互联网

标签:友元 name 方式 show age Student string 函数


一、介绍

  • 个人认为该函数的作用及时能够是: 非成员函数可以使用 私有的 成员变量
  • 用途: 便于写 sort函数 和 优先队列 的 重载函数调用运算符()

二、 专业解释:

  • 一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。现在,我们来介绍一种例外情况——友元(friend)。
  • 借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。

三、配合代码理解使用

3.1 非成员函数调用私有成员

class Student
{
private:
    string name;
    int age;
public:
    Student(string name,int age) : name(name){
        this->age = age;
    }
    friend void show(Student *pa);
};

inline void show(Student *pa)
{
    cout << pa->name << " " << pa->age << endl;
}
main()
{
    Student b("xiaoming",10);
    show(&b);
    return 0;
}
  • 声明方式:friend 函数名称
  • 用哪个类就在哪个类里面进行声明
  • 函数都是public

3.2 将其他类的成员函数声明为 友元函数

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

class Address; //提前声明,但不能使用里面的私有变量

class Student
{
private:
    string name;
    int age;
public:
    Student(string name, int age) : name(name)
    {
        this->age = age;
    }
    void show(Address *addr); // 只能类外定义,因为要使用私有变量,但是没有完整的定义
    //因为创建对象时要为对象分配内存,在正式声明类之前,编译器无法确定应该为对象分配多大的内存
};

class Address
{
public:
    Address(string prov, string city) : prov(prov), city(city) {}
    friend void Student::show(Address *addr);
private:
    string prov, city;
};

inline void Student::show(Address *addr)
{
    cout << name << " " << age << endl;
    cout << "addres: " << addr->prov << " city: " << addr->city << endl;
}

main()
{
    Student b("xiaoming", 10);
    Address a("huaxia", "earth");
    b.show(&a);
    return 0;
}

总结:

  • 友元函数的定义地方参照上一条
  • 其他类使用一定需要先声明
  • 没有正式的定义前,是无法创建对象的,因为类不占存储空间,更无法给变量分配内存
  • show函数的定义必须是类外,因为无法使用address的私有变量
  • 这里简单介绍一下类的提前声明。一般情况下,类必须在正式声明之后才能使用;但是某些情况下(如上例所示),只要做好提前声明,也可以先使用。
  • 因为创建对象时要为对象分配内存,在正式声明类之前,编译器无法确定应该为对象分配多大的内存。

参考资料:

  1. http://c.biancheng.net/cpp/biancheng/view/211.html

标签:友元,name,方式,show,age,Student,string,函数
来源: https://blog.csdn.net/QT_continue/article/details/115494323

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

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

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

ICode9版权所有