转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针

这篇具有很好参考价值的文章主要介绍了转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        一、转换操作符的定义

        转换操作符是一种特殊的类成员函数它定义将类类型值转变为其他类型值的转换,转换操作符在类定义体内声明,在保留字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使用操作符.*调用成员函数f
	A *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使用操作符.*调用成员函数f
	
	return 0;
}

          fp私有也可以文章来源地址https://www.toymoban.com/news/detail-805612.html

#include <iostream> 
 
struct A{
private:
	using fp = void (A::*)();//类成员函数指针
public:
	operator fp (){ //转换函数//A类对象转换为A类成员函数指针
		return A::f;
	}
private:
	void f(){ std::cout << "A::f()\n"; }	//私有的成员函数
};
 
 
int main()
{	
	A a;
	//using fp = void (A::*)();
	//fp p = a;
	void (A::*p)() = a;
	(a.*p)();  		//对象a使用操作符.*调用成员函数f
	
	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";
	}
};

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;
}

到了这里,关于转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val

      📜 本章目录: 0x00 操作符(operators) 0x01 内建类型(Build-in) 0x02 类型转换:显式类型转换 0x03 在较长数字中使用下划线 0x04 字符串(String) 0x05 字符串模板(String Templates) 0x06 字符串连接(变量插值) 0x06 指定变量类型 0x07 可变 var 和不可变 val 0x00 操作符(operators)

    2024年02月11日
    浏览(47)
  • 【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一、隐式类型转换 (一)整型提升的意义 (二)如何进行整型提升呢? 二、算数转换 三、操作符的属性 (一)操作符优先级汇

    2024年02月16日
    浏览(44)
  • 《C和指针》笔记19: 条件操作符

    条件操作符接受三个操作数。它也会控制子表达式的求值顺序。下面是它的用法: 条件操作符的优先级非常低,所以它的各个操作数即使不加括号,一般也不会有问题。但是,为了清楚起见,人们还是倾向于在它的各个子表达式两端加上括号。 给个例子说明它的用法: 可以

    2024年02月10日
    浏览(41)
  • 《C和指针》(5)操作符和表达式

    下面这个表达式的类型和值分别是什么? 答 :该值为2.0,如果要进行浮点除法,请使用以下表达式 下面这个程序的结果是什么? 答 :这是一个狡猾的问题。比较明显的回答是-10(2-3 *4),但实际上它因编译器而异。乘法运算必须在加法运算之前完成,但并没有规则规定函数调用

    2024年02月08日
    浏览(31)
  • 【PostgreSQL】函数与操作符-比较函数和操作符

    PostgreSQL中的比较函数和操作符用于比较两个表达式的值。它们的作用是确定表达式的值是否满足某种条件,例如等于、大于、小于等。 比较函数是一个接受两个参数的函数,返回一个布尔值,表示两个参数是否满足某种条件。例如,equal()函数用于判断两个参数是否相等,

    2024年01月17日
    浏览(52)
  • VEX —— 数据类型及操作符

    目录 一,数据类型 类型种类 struct 类型转换 二,操作符 点操作符 Dot operator 比较操作符 Comparisons 类型交互 操作符优先级 三,注释 四,保留的         VEX即可在32模式下运行,也可在64位模式下运行;在32位下,所有float/vector/integer都是32位;在64位下,它们就是

    2024年02月10日
    浏览(52)
  • 【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制 同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来 进制的定义:从右往左

    2024年02月22日
    浏览(52)
  • PostgreSql 数学函数及操作符

    操作符 描述 示例 结果 + 加 4+7 11 - 减 4-7 -3 * 乘 4*7 11 / 除(整数除法将截断结果) 7/3 2 % 模(求余) 6%4 2 ^ 幂(指数运算) 3^3 27 |/ 平方根 |/36 6 ||/ 立方根 ||/8 2 ! 阶乘 5! 120 !! 阶乘(前缀操作符) !!5 120 @ 绝对值 @-5.0 5 二进制AND 3115 15 | 二进制OR 31|15 31 # 二进制XOR 31#15 16 ~ 二进制NOT ~1 -2 二

    2024年02月11日
    浏览(37)
  • PostgreSql 字符串函数及操作符

    函数 返回类型 描述 示例 结果 string||string text 字符串连接 ‘Post’||‘greSQL’ PostgreSQL bit_length(string) int 字符串中的二进制位数的个数 bit_length(‘jose’) 32 char_length(string) int 字符串中的字符个数 char_length(‘数据库’) 3 convert(string using conversion_name) text 使用转换名字改变编码,转

    2024年02月12日
    浏览(46)
  • C语言操作符篇章+系统讲解分析+深入理解操作符+原反补结合的具体应用+根源进行讲解+进制转换+操作环境+实例剖析+上万字+百张图片精细化讲解

    在讲解操作符之前需要讲解一下原反补和进制之间的转换 并且在讲解操作符的时候会重点对难点进行讲解,也就是算数操作符和逻辑操作符 并且会在讲解附带实例 和最后面的代码分析 ————————————————————————————————————————

    2024年02月20日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包