当前位置: 首页 > news >正文

友元和运算符重载

1.  友元

        可以把某些选定的函数看作类的“荣誉函数”,允许它们访问类对象中非公共的成员,就好像它们是类的成员一样,这种函数称为类的友元。友元可以访问类对象的任意成员。

1.1  友元函数

  • 友元函数是一种定义在类外部的普通函数,但它需要在类体内进行说明
  • 为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数
  • 格式: friend  类型 友元函数名(参数表);
  • 友元的作用在于提高程序的运行效率

注意事项:

  • 友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。
  • 友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。
  • 某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。
  • 友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性

1.2  友元类

  • 如果某类B的成员函数会频繁的存取另一个类A的数据成员, 而A的数据成员的Private/Protectd限制造成B存取的麻烦, B只能通过Public的成员函数进行间接存取
  • 把B做成A类的友元类,即A类向B类开放其Private/Protectd内容, 让B直接存取
  • 友元类:一个类可以作另一个类的友元
  • 友元类的所有成员函数都是另一个类的友元函数
  • 友元类的定义:     friend class 类名;

2.  运算符重载

2.1  概念

  • 运算符重载类似于函数重载
  • 运算符重载允许把标准运算符(如+、—、*、<等)应用于定制数据类型的对象
  • 什么情况下需要考虑运算符重载? 需要用运算符操作自定义类的对象时,如对象之间直观自然,可以提高比较大小等,通过重载支持类的运算
  • 程序的可读性   体现了C++的可扩充性

2.2  定义

成员函数

  • 作为类的成员函数或友元函数、作为一般函数(很少用)
    • ( )  [ ]  ->   =  的重载函数必须是类的成员函数
  • 成员函数原型的格式:     函数类型 operator 运算符(参数表);
  • 成员函数定义的格式:     函数类型 类名::operator 运算符(参数表){         函数体;     }
  • 以成员函数的方式重载运算符
    • 单目运算符:不带参数,该类对象为唯一操作数
    • 双目运算符:带一个参数,该类对象为左操作数、参数为右操作数 

友元函数

  • 友元函数原型的格式:     friend 函数类型 operator 运算符(参数表);
  • 友元函数定义的格式:     函数类型 operator 运算符(参数表){         函数体;     }
  • 以友元函数的方式重载运算符
    • 单目运算符:带一个参数,该参数为唯一操作数,是自定义类的对象  ++(a)
    • 双目运算符:带两个参数,第一个参数为左操作数、第二个参数为右操作数,至少有一个参数为自定义类的对象    +(a, b)

http://www.lryc.cn/news/515600.html

相关文章:

  • 【数据库事务锁的类型:读锁/写锁、悲观锁/乐观锁、表锁/页锁/行锁】
  • 【Motion Builder】配置c++插件开发环境
  • 多线程访问FFmpegFrameGrabber.start方法阻塞问题
  • MySQL使用记录
  • 【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
  • Python 数据结构揭秘:栈与队列
  • 常见的框架漏洞
  • 在C++中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序;使用python的方案
  • 《Vue3实战教程》26:Vue3Transition
  • 【架构设计(一)】常见的Java架构模式
  • 自定义有序Map
  • Jenkins(持续集成与自动化部署)
  • redis7基础篇2 redis的哨兵模式2
  • windows终端conda activate命令行不显示环境名
  • SpringBoot 2.6 集成es 7.17
  • 加固服务器有什么用?
  • Personal APP
  • 探索最新的编程技术趋势:AI 编程助手和未来的编程方式
  • Android:文件管理:打开文件意图
  • 从纯虚类到普通类:提升C++ ABI兼容性的策略
  • QT中如何限制 限制QLineEdit只能输入字母,或数字,或某个范围内数字等限制约束?
  • Tailwind CSS 使用简介
  • iOS 逆向学习 - iOS Architecture Cocoa Touch Layer
  • C语言实现库函数strlen
  • 050_小驰私房菜_MTK Camera debug, data rate 、mipi_pixel_rate 确认
  • (六)vForm 动态表单(数据量大,下拉选卡顿问题)
  • 【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查
  • 投稿指南【NO.12_14】【极易投中】期刊投稿(毛纺科技)
  • 机器学习算法的分类
  • Linux操作系统下,挂ILA