【C++基础】类和对象——友元

友元的概念

在C++中,不能被外部访问的私有属性,通过友元可以访问。

友元的关键字:friend

友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

一、全局函数做友元

函数名复制到类内,并在开头加上friend关键字;

示例:

#include<iostream>
using namespace std;class Student
{//友元可以访问私有(private)内容friend void showStudent(Student* s);public:string name;int age;Student(){name = "张三";age = 10;gender = "彩虹小马";}private:string gender;
};void showStudent(Student* s)
{cout << "看看你的性别:" << s->gender;
}void main()
{Student s;showStudent(&s);
}

输出:

二、类做友元

Teacher类Student类的友元。

那个在Teacher类内可以访问到Student类内的私有属性。

但创建的Teacher对象不能访问到Student类内的私有属性。

示例:

#include<iostream>
using namespace std;class Teacher;class Student
{//友元可以访问私有(private)内容friend class Teacher;public:string name;int age;Student();private:string gender;
};//类外实现
Student::Student()
{name = "张三";age = 10;gender = "彩虹小马";
}class Teacher
{public:string name;void visit(){cout << "看看性别:" << s->gender << endl;}Teacher(){s = new Student;}private:Student* s;
};void main()
{Teacher t;t.visit();//t.s.gender;  不能访问
}

输出:

三、成员函数做友元

这个友元就是在套娃,简单说就是先声明,声明的东西拿来做友元,最后再实现。先看示例,看完在分析。

友元成员函数和构造函数需要外部实现,不然会报未定义错误。

示例:

#include<iostream>
using namespace std;class Student;class Teacher
{public:string name;//visit函数做友元void visit();Teacher();private:Student* s;
};class Student
{//友元可以访问私有(private)内容friend void Teacher::visit();public:string name;Student(){name = "张三";gender = "彩虹小马";}private:string gender;
};Teacher::Teacher()
{s = new Student;
}void Teacher::visit()
{cout << "visit看看性别:" << s->gender << endl;
}void main()
{Teacher t;t.visit();

输出:

成员函数友元的声明实现:

声明:类B类A
{public:声明:函数a声明:构造函数A
private创建对象B
}类B
{友元 返回值 类A::函数a
public:构造函数B
private:属性b
}实现:构造函数A
{对象B = new 类B
}实现:函数a
{访问属性b
}

注意事项:

  1. 友元的实现


  2. 构造函数的实现

  3. 提供私有属性的类B
    声明类B

    实现类B

    是不是先讲类的声明和实现,再讲友元的声明和实现会好理解点?

【C++基础】类和对象——友元相关推荐

  1. Python基础(类与对象)

    Python基础(类与对象) 一.编程的两大思想 面向过程和面向对象 面向过程 面向对象 区别 事物比较简单,可以用线性的思维去解决 事物比较复杂,使用简单的线性思维无法解决 共同点:面向对象和面向过 ...

  2. Python基础——类与对象

    Python基础--类与对象 Python基础--类与对象 类与对象 数据类型 对象 类的创建 创建语法 类的创建 对象的创建 对象调用类中的内容 类属性,类方法,静态方法 类属性 访问类属性 类方法 ...

  3. 「地表最强」C++核心编程(七)类和对象--友元

    环境: 编译器:CLion2021.3:操作系统:macOS Ventura 13.0.1 文章目录 一.全局函数做友元 二.类做友元 三.成员函数做友元 地表最强C++系列传送门: 「地表最强」C+ ...

  4. ios开发之OC基础-类和对象

    ios开发之OC基础-类和对象 本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录 ...

  5. ios c语言调用oc方法,ios开发之OC基础-类和对象(示例代码)

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  6. Java基础--类与对象

    2019独角兽企业重金招聘Python工程师标准>>> 一.类与对象 类是对一类事物描述,是抽象的.概念上的定义.   对象是实际存在的该类事物的每个个体,因而也称实例(instan ...

  7. Java 基础——类和对象

    Java作为一种面向对象语言.支持以下基本概念: •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究类与对象的概念. 对象:对象是类的一个实例,有状态和行为.例 ...

  8. 不能将brassplus类型的值分配到brass类的实体_Java 基础 - 类与对象

    类.对象和引用的关系 类和对象的关系 类是对象的模版,对象是类的一个实例,一个类可以有很多对象 一个Java程序中类名相同的类只能有一个,也就是类型不会重名 一个对象只能根据一个类来创建 引用和类以及 ...

  9. python编程基础—类与对象

    1.类的声明与定义 Python 是一门面向对象的语言. 面向对象编程 - Object Oriented Programming(简称 OOP)是一种编程思想,在面向对象编程中,把对象作为程序的基本 ...

最新文章

  1. CISCO路由器产品配置手册
  2. KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?...
  3. Vivado 时序分析(理论篇) 卷一
  4. ad中那个快捷键是重复上一部_Excel中的F4快捷键用的好,告别加班没烦恼!
  5. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
  6. django1.9 创建数据表
  7. php array_walk和array_walk_recursive对数组中的每个元素应用用户自定义函数
  8. SPSS 有调节的中介与有中介的调节【SPSS 042期】
  9. vb杨辉三角代码编写_杨辉三角怎样用VB写杨辉三角的完整代码 – 手机爱问
  10. OpenCV对图片的读写,像素值的访问,修改
  11. 常见的java设计模式
  12. ros与arduino通讯(一)ros_arduino_bridge功能包
  13. TJA1042T/3与国产CAN芯片SIT1042T/3性能对比
  14. deepin - PS CS6 弹出试用结束(解决方案)
  15. 什么是PMU(PMIC)【转】
  16. 牛腩新闻系统--.NET使用一般处理程序生成验证码
  17. java 稀疏贝叶斯算法_稀疏贝叶斯学习(SparseBayesianLearning).PDF
  18. 分布式技术与实战第六课 分布式缓存设计
  19. JS 逆向之 Hook
  20. scanf与getchar的区别

热门文章

  1. kafka 消息堆积解决
  2. Ubuntu 回收站 位置(处理回收站不能打开问题)
  3. java数据结构学习笔记-二叉树前、中、后序遍历
  4. 使用面向对象的思想,编写自定义描述狗的信息。设定属性包括:品种,年龄,心情,名字;方法包括:叫,跑
  5. 湘潭大学 计算机学院程诗婕,传播校园之声,讲好湘大故事 ——2019年度湘潭大学“十佳学生记者”和“优秀学生记者”颁奖典礼圆满落幕...
  6. matlab打靶法程序,打靶法(含Mtlab程序).doc
  7. 申请OV、EV证书需要什么资料?邓白氏编码是什么?
  8. animate用法 js原生_原生JS封装animate运动框架的实例
  9. COC部落又散了北京爱情故事
  10. 男生诡异世界观,是不是跟你想的不一样~