Operator 运算符 || 可调用对象

news/2024/9/22 22:08:40/

运算符重载

  1. 重载:在同一个作用域内定义多个同名函数,这些函数具有不同的参数列表或函数体。泛型:允许编写代码时不指定具体的数据类型
  2. 重载运算符,可以重新定义运算符的行为
  3. 几元运算符:包含几个运算对象,重载的函数的行为应与内置版本一致
  4. 声明运算符重载函数:  返回类型 +  operator + 运算符  +(参数列表(运算对象的数目));
  5. 注意:重载运算符,或者是类的成员,或者至少包含一个类类型参数,
  6. 如果作为成员函数,左侧运算对象为隐式this指针,所以显示的参数列表数量应少一个
  7. 调用方式:
    1. 显示调用重载函数:非成员函数,不用类实例调用,成员函数需要类实例+成员访问运算符,两者都传入实参(运算对象),
    2. 隐式调用重载函数,显示调用运算符:直接使用运算符,和运算对象
  8. 对于运算符重载函数:有时作为成员函数更好,有时仅能作为非成员函数

实例:

  1. IO运算符:必须是非成员函数,因为如果是成员函数,左侧运算对象将为类,而非iostream,这是不符合规范的,
  2. io对象为非常量引用,因为会改变自身和不可拷贝,返回值为自身的引用,因为不可拷贝
  3. //
  4. 算术运算符:可以为非成员的
  5. 会接受常量引用,并返回新值,不要返回临时对象的引用
  6. //
  7. 赋值运算符:应为成员函数
  8. 接受常量引用,并返回 *this的引用
  9. //
  10. 下标运算符[]:应为成员函数
  11. 接受size_t下标,返回类数据成员的元素引用
  12. //
  13. 递增递减运算符:应为成员函数
  14. 空参数列表,返回 *this的引用,
  15. 如何区分前置和后置?前置++a:先自增,再返回值,后置a++;先返回值,再自增
  16. 对于后置版本,会传递不被使用的int形参,显示调用后置版本:传入实参,实参不参与运算

函数对象

  1. 重载()函数调用运算符的类,被称为函数对象,这个类就成为了可调用对象
  2. 使用重载函数的方式,就像调用函数一样调用类
  3. //
  4. 如何区分创建类对象,还是调用重载()的函数?
  5. 调用函数和普通成员函数一样,都是要通过类实例调用,知识没有了成员访问运算符和函数名,而对于创建类实例,需要类名
  6. //
  7. 对于算法的谓词应传入可调用对象,其中编写了lamba后,编译器将产生一个未命名的函数对象(包含operator()),并且形参列表,函数体,返回值,都和lambda没有差异,
  8. 所以完全写一个函数对象,并在谓词传入函数对象实例
  9. 对于对于捕获列表,按引用捕获,类对象可以直接使用对象,但对于值捕获,将会拷贝到lambda中,所以类会建立数据成员,和构造函数,通过非默认构造,初始化成员
  10. 因为是非默认构造,在写等价类是,传入的谓词,的类实例必须显示传递值捕获的变量
  11. 对于谓词,我们可以传入STL库中的表示运算符的函数对象,它们都是模板类,可以直接传入类实例
  12. //
  13. 对于定义的function对象,我们存入可调用对象,但是不能存入有函数重载的可调用对象,将出现二义性
  14. 但是可以使用函数指针或lambda去替代特定版本

http://www.ppmy.cn/news/1511161.html

相关文章

FFmpeg源码:av_log2函数分析

一、av_log2函数的声明 av_log2函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavutil/common.h中: #ifndef av_log2 av_const int av_log2(unsigned v); #endif 该函数作用是:求形参v是2的多少次幂&#…

record 关键字

public record GetTemplateSettingsRequest(string SubjectUuid, SubjectType SubjectType) : IRequest<TemplateSettingsVO>; 使用了 C# 9 引入的新特性 record 来定义一个不可变的数据结构。以下是对这行代码的详细解释&#xff1a; 1. record 关键字 record 是 C# …

基于微信小程序地图实现点位标注、覆盖物、地图聊天

目录 小程序部分map标签的使用获取用户经纬度并转换地址地图点击事件覆盖物标注点击并实现弹窗交互数据库及接口部分数据库表结构设计API搭建小程序接口使用注意事项wx.getLocation深入控制地图小程序部分 map标签的使用 创建小程序的步骤这里不再重复赘述,在wxml页面中放一个…

【经典算法】BFS_最短路问题

目录 1. 最短路问题介绍2. 算法原理和代码实现(含题目链接)1926.迷宫中离入口最近的出口433.最小基因变化127.单词接龙675.为高尔夫比赛砍树 3. 算法总结 1. 最短路问题介绍 最短路径问题是图论中的一类十分重要的问题。本篇文章只介绍边权为1(或边权相同)的最简单的最短路径问…

TinyWebserver的复现与改进(6):定时器处理非活动连接

如果客户端长时间没有动作&#xff0c;会占用了许多连接资源&#xff0c;严重影响服务器的性能。因此需要通过实现一个服务器定时器&#xff0c;处理这种非活跃连接&#xff0c;释放连接资源。 定时器处理流程 SIGALARM触发&#xff1a;整个流程开始于一个 SIGALARM 信号&…

使用WebStorm进行高效的全栈JavaScript开发

使用WebStorm进行高效的全栈JavaScript开发&#xff0c;是一个涉及多方面技能与工具利用的过程。WebStorm&#xff0c;作为JetBrains公司推出的一款专为前端开发者和全栈工程师设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;以其强大的功能、卓越的性能和友好的用…

【51单片机】DS1302驱动,11.0592MHZ,使用DS1302

ds1302.h: sbit DS1302_CLK = P3 ^ 6; // 时钟引脚 sbit DS1302_IO = P3 ^ 4; // 数据引脚 sbit DS1302_RST = P3 ^ 5; // 复位引脚#define DS1302_DATA_IO DS1302_IO // 定义DS1302的数据口<

C++ 线程 一些同步方式

C 线程一些同步方式 1.互斥锁&#xff08;Mutex&#xff09;2. 读写锁&#xff08;Reader-Writer Lock&#xff09;3. 信号量&#xff08;Semaphore&#xff09;4. 原子操作&#xff08;Atomic&#xff09;5. 屏障&#xff08;Barrier&#xff09;6. 条件变量&#xff08;Condi…