转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针
一、转换操作符的定义
转换操作符是一种特殊的类成员函数 ,它定义将类类型值转变为其他类型值的转换,转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型,转换函数采用如下通用形式:
operator type();
这里,type表示内置类型名、类类型名 或 由类型别名所定义的名字,本文讨论转换普通函数指针类型、转换类的成员函数指针类型
二、转换普通函数指针类型
在类内定义类型别名,定义转换函数,把类对象转换为普通函数指针,代码如下:
#include <iostream> void f(){ //普通函数std::cout << "f()";
}struct A{typedef void (*fp)(); //类型别名//using fp = void (*)(); //C++11标准operator fp (){ //转换函数//A类对象转换为普通函数指针return ::f;}
};int main()
{ A a; A::fp p = a; //A作用域的类型别名fp//将对象a转换为普通函数指针p();return 0;
}
三、转换类的静态函数为普通函数指针类型
因为运算符的优先级,函数指针解引用要加括号
#include <iostream> struct A{typedef void (*fp)(); //类型别名//using fp = void (*)(); //C++11标准operator fp (){ //转换函数//A类对象转换为普通函数指针return A::f;}static void f(){ std::cout << "static void A:: f()\n"; }//静态函数
};int main()
{ A a; A::fp p = a; //A作用域的类型别名fp//将对象a转换为普通函数指针//A::f();//p();(*p)();//运算符优先级,要加括号return 0;
}
四、转换类的成员函数指针类型
.*和->*两个操作符,能够将成员指针绑定到实际对象,左操作数必须是类类型的对象或类类型的指针,右操作数是该类型的成员指针
#include <iostream> struct A{using fp = void (A::*)();//类成员函数指针operator fp (){ //转换函数//A类对象转换为A类成员函数指针return A::f;}void f(){ std::cout << "A::f()\n"; }
};int main()
{ A a;A::fp p = a; //A对象a转换为类的成员函数指针类型(a.*p)(); //对象a使用操作符.*调用成员函数fA *ap = new A;(ap->*p)(); //类类型指针使用操作符->*调用成员函数delete ap;return 0;
}
可以把私有的成员函数转换为成员函数指针,因为转换函数是公有的,转换函数可以在类内访问私有成员,我们把对象转换一下,达到了对象可以调用私有的成员函数目的,看起来真的好神奇
#include <iostream> struct A{using fp = void (A::*)();//类成员函数指针operator fp (){ //转换函数//A类对象转换为A类成员函数指针return A::f;}
private:void f(){ std::cout << "A::f()\n"; } //私有的成员函数
};int main()
{ A a;A::fp p = a; //A对象a转换为类的成员函数指针类型(a.*p)(); //对象a使用操作符.*调用成员函数freturn 0;
}
五、成员函数指针作为函数的参数,类对象隐式转换
#include <iostream> struct A{using fp = void (A::*)();//类成员函数指针operator fp (){ //转换函数//A类对象转换为A类成员函数指针return A::f;}
private:void f(){std::cout << "A::f()\n";}
};void test( A::fp p){ //成员函数指针作为函数参数A b;( b.*p )(); //成员函数指针,调用成员函数
}int main()
{ A a;test(a); //类型转换//A对象a转换为A类成员函数指针return 0;
}
六、不用转换操作符,只用公有的成员函数指针变量,对象一样可以访问私有成员函数
#include <iostream> struct A{using fp = void (A::*)();//类成员函数指针fp p = A::f; //公有成员变量
private: //私有的成员函数void f(){std::cout << "A::f()\n";}
};int main()
{ A a,b;( a.*(a.p) )();//( a.*(b.p) )(); //说明p是对象的就可以 return 0;
}
相关文章:

转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针
一、转换操作符的定义 转换操作符是一种特殊的类成员函数 ,它定义将类类型值转变为其他类型值的转换,转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型,转换函数采用如下通用形式: operator type(…...

易控智驾高精度地图开发工程师校招一面、二面面经
本文介绍2024届秋招中,北京易控智驾科技有限公司的高精度地图开发工程师岗位的2场面试基本情况、提问问题等。 12月投递了北京易控智驾科技有限公司的高精度地图开发工程师岗位,所在部门暂不清楚。目前完成了一面、二面流程,在这里记录一下2场…...

用VSCode玩STM32的烧录工具 CooCox Cortex Flash Programmer
一、下载软件 经热心兄弟推荐的版本,不知道有没有版权,如有版权问题,请通知删除。 CSDN - 0积分下载:https://download.csdn.net/download/qq_49053936/88744187 二、生成bin文件 插件不同,方法有所不同,各…...

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server
在Pycharm上部署项目到远程服务器,有时候需要启动SSH会话,启动的时候发现没反应,且事件日志显示:无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边,发现“无默…...

c++设计模式之单例模式
介绍 一个类无论创建多少对象,都只能得到一个实例 A* p1new A(); A* p2new A(); A* p3new A(); 如上述代码中,我们通过new运算符创建出了类A的三个对象实例,而我们现在要做的是,如何设计类A,使得上述代码运行之后永远…...

Git学习笔记(第5章):Git团队协作机制
目录 5.1 团队内协作 5.2 跨团队协作 Git进行版本控制都是在本地库操作的。若想使用Git进行团队协作,就必须借助代码托管中心。 5.1 团队内协作 问题引入:成员1(大佬)利用Git在宿主机上初始化本地库,完成代码的整体…...

Python 面向对象绘图(Matplotlib篇-16)
Python 面向对象绘图(Matplotlib篇-16) 🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…...

Linux开机自动挂载window密码有转义字符的共享文件夹
项目上遇到需要自动挂载windows共享盘到linux系统中,由于windows密码有英文逗号(,),被linux识别成了参数分隔符,在网上找了很多办法都不行,后来通过这种方式完美解决,linux系统是centos8.4文章阅读操作时间在5分钟左右…...

Redis(四)
1、Redis的单/多线程 1.1、单线程 其实直接说Redis什么单线程或者是多线程,不太准确,在redis的4.0版主之前是单线程,然后在之后的版本中redis的渐渐改为多线程。 Redis是单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#…...

一文解读ISO26262安全标准:术语
一文解读ISO26262安全标准:术语 做汽车行业的人,都知道安全标准ISO26262,但是仔细说说它到底讲的是什么?好像又说不出来,这是个玄之又玄的话题,笔者试图将这份标准以简明扼要、并且容易理解的形式梳理出来&…...

使用stable diffussion插件StableSR将图片高清放大
一:需要安装的插件 1、StableSR,项目地址:https://github.com/pkuliyi2015/sd-webui-stablesr 不过国内没什么用,访问不了,可以用下面的国内镜像: https://gitee.com/han51535/sd-webui-stablesr.git 这…...

ActiveMQ:专注消息传递,助您构建高效稳定的系统
在数字化世界的今天,应用程序和系统之间的通信变得日益重要,为了确保数据能够在不同的服务和组件之间高效、可靠地传输,消息队列技术应运而生。 Apache ActiveMQ 作为一种流行的开源消息队列技术,为企业级应用提供了强大的支持&am…...

小程序样例1:简单待办列表
基本功能: 显示所有待办列表(点击不同的文本进行显示) 没完成的待办 已完成的待办 新建待办test 清除待办foo 代码js文件: //index.js //获取应用实例 const app getApp(); Page({data: {todo: ,todos: [{"id": 1474…...

Jvm相关知识(面试高级必备)
类的实例化顺序 先静态、先父后子 先静态:父静态>子静态 优先级:父类>子类 静态代码块>非静态代码块>构造函数 一个类的实例化过程: ①.父类的static代码块,当前类的static; ②.顺序执行…...

android 常规log的查看与抓取
ProtoLog开关 在代码中我们经常看见ProtoLog打印的log,如下: ProtoLog.i(WM_DEBUG_ANIM, "Animation start delayed for %s", mAnimatable);这种log正常情况不会显示,因此我们需要打开开关,其格式为: adb …...

【SpringBoot】—— 如何创建SpringBoot工程
SpringBoot简化了Spring应用的初始搭建和开发过程。 工程创建 新建模块 出现java: 错误: 无效的源发行版:18这样的错误, 修改pom.xml文件 出现以下信息,即运行成功 修改默认端口 创建application.yml文件 内容: server:port:…...

2018年认证杯SPSSPRO杯数学建模A题(第二阶段)海豚与沙丁鱼全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 基于聚类分析的海豚捕食合作策略 A题 海豚与沙丁鱼 原题再现: 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗,所以在距离较远时,海豚只能使用回声定位方法来判断鱼群的整体位置,难…...

C# tcp客户端字符串(图片名称)+ 图片数据打包,发送到服务端;服务端接收到数据后解析数据包
在C#中,要将字符串和图片数据打包发送到服务端,并在服务端解析这些数据,可以按照以下步骤进行: 客户端打包数据 1、创建一个自定义的数据结构来保存字符串和图片数据。 2、将字符串转换为字节数组。 3、将图片数据转换为字节数组。…...

【机组】算术逻辑单元带进位运算实验的解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌺一、 实验目…...

axios query传数组参数的格式
在 Axios 中,当你需要传递数组参数时,可以使用以下几种方式进行格式化: 使用 paramsSerializer 将数组转换为逗号分隔的字符串: import axios from axios;import qs from qs;const arrayParams [param1, param2, param3];axios.…...

2018年认证杯SPSSPRO杯数学建模B题(第一阶段)动态模糊图像全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 B题 动态模糊图像 原题再现: 人眼由于存在视觉暂留效应,所以看运动的物体时,看到的每一帧画面都包含了一段时间内 (大约 1/24 秒) 的运动过程,所以这帧画面事实上是模糊的。对电影的截图来说&…...

qt学习:Qfile文件类
目录 功能 读接口 参数说明 返回值 例子 写接口 参数说明 QString转为QByteArray 其他接口 功能 该类是一个用户读写文件io口,它继承于QFileDevice 读接口 qint64 read(char *data,qint64 maxSize)// 一次读取maxSize大小的数据存放在以data…...

从 GPT1 - GPT4 拆解
从 GPT1 - GPT4 拆解 从 GPT1 - GPT4GPT1:更适用于文本生成领域GPT2:扩展数据集、模型参数,实现一脑多用(多个任务)GPT3:元学习 大力出奇迹InstructGPT:指示和提示学习 人工反馈强化学习 RLHF…...

Python项目——计算器(PySide6+Pyinstaller)
1、介绍 使用python编写一个计算器,可以实现基本的运算。【注】该项目最终还有一些细小的bug没有完善,例如符号可以一直输入。 2、实现 使用pyCharm创建一个新的项目。 2.1、设计UI 使用Qt designer设计一个UI界面,保存ui文件࿰…...

ChatGPT 和文心一言哪个更好用?
根据提供的搜索结果,ChatGPT和文心一言各有特点和优势,选择哪一个更好用取决于具体的应用场景和个人需求。以下是两者的对比: ChatGPT: 适用场景:适合需要生成大量知识性文本的任务,如问答系统、知识图谱…...

数据备份与恢复
备份概述 一、备份方式 按照数据库服务状态分为: 冷备份:在备份时暂停数据库运行和服务,将整个数据库复制到备份设备中 热备份:在备份时不停止数据库的运行和服务 按照备份的数据分为: 物理备份:备份…...

数据库原理及数据库的优化
1、数据库的原理 数据库:持久化存储,存到硬盘 性能:oracl>db2>sqlserver>mysql oracl,db2,sqlserver性能差不多,几十万次每秒,myslq性能差很多,几千次每秒,都…...

C语言第三弹---数据类型和变量
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 数据类型和变量 1、数据类型介绍1.1、整型1.2、浮点型1.3、字符型1.4、布尔类型1.5、各种数据类型的长度1.5.1、sizeof操作符1.5.2、数据类型的长度1.5.3、sizeo…...

[通知]rust跟我学:文件时间属性获得方法文章已上线
大家好,我是带剑书生,开源库get_local_info的作者。目前我的付费专栏已经上线第七篇文章,用于介绍在实现get_local_info过程中,遇到该问题所使用的解决方法,喜欢的朋友可以去订阅了,19.9元,非常…...

基于嵌入式的智能智能通风系统
基于嵌入式的智能智能通风系统 功能说明 通过微信小程序控制窗户的开关状体以及倒计时开关和定时开关,小程序上实时显示当前温度湿度和光照强度。 功能展示 02智能通风系统 Mqtt服务器 http://www.yoyolife.fun/iot:Mqtt服务器,我是在这里注…...