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

c++函数调用运算符及类型转换运算符重载


author: hjjdebug
date: 2025年 05月 17日 星期六 14:44:48 CST
descrip: c++函数调用运算符及类型转换运算符重载


文章目录

  • 0. 前言. 运算符包括以下运算符.
  • 1. 运算符重载语句一般格式:
  • 2. 函数调用运算符:
  • 3. 类型转换运算符: 例如 int(); double(); bool();
  • 4. 测试代码

0. 前言. 运算符包括以下运算符.

算术运算符:
关系运算符:
逻辑运算符:
位运算符:
赋值运算符:
下标运算符:
成员访问运算符:
函数调用运算符:
类型转换运算符:

operator 关键字, 可以重载现有的运算符.可定义在类内,也可定义在类外
运算符的优先级和结合性保持不变.
不能创建新的运算符,只能重载现有运算符

1. 运算符重载语句一般格式:

返回值类型 operator 运算符(参数列表) [const] {函数体}
看出来了,运算符就是一类函数. 运算符就等价于函数名.
所以obj.函数名(参数列表)形式的调用 演变为obj运算符(函数列表)调用, 省略了"."

重点介绍2类运算符:

2. 函数调用运算符:

运算符()(也称为函数调用运算符)
我们重载了这个操作符,就可以用obj(参数列表)来执行对应的函数体代码了.
好处就是不用为这堆函数体起名字了,名字就是运算符.写起来还切且,看多了还顺眼.
这与通常的func(参数列表)形式一致,
所以把这个obj叫做函数对象或仿函数
举例:
struct Test1 {
// 重载()运算符
constexpr bool operator()() const noexcept {return true;}
int operator()(int a, int b) const {
return a + b;
}
};
调用:
Test1 obj1;
bool b1=obj1();
int i1=obj1(2,3);
在这里,obj1不是函数,而是个Test1类的对象.

3. 类型转换运算符: 例如 int(); double(); bool();

c++中显式的类型转换是static_cast、dynamic_cast、和reinterpret_cast。
不过,类还可通过定义operator type()实现到其他类型的转换:
自定义的转换更灵活! 转换的规则由自己定义.
类型转换运算符可以根据不同的上下文环境自动完成类型转换.
我们举个例子,将类的类型自动转换为bool 和自动转换为double 类型.
与普通的运算符重载相比, 运算符前边不用定义返回类型了, 因为返回类型放到了运算符符后面.
举例: //完整代码在后面
struct Rational
{
Rational(int num=0,int den=0):_num(num),_den(den){} //构造函数
constexpr operator bool() const noexcept {return _num!=0;}
constexpr operator double() const noexcept {return (double)_num/_den;}
private:
int _num;
int _den;
};

用constexpr修饰, 是说把代码执行提前到编译期.把计算结果优化到调用代码里
这样运行的时候不用再调用这个函数来计算,函数早被优化没了,属于优化操作的考虑.
去掉它也没啥关系,可能运行稍微慢一点.

使用:
在判断语句中,其上下文是判断返回值是真或假. 例: if(obj) {}
赋值语句,其上下文是隐式转换为目的类型. 例: double d= obj;

4. 测试代码

$ cat main.cpp
#include <iostream>
//operator 关键字, 可定义在类内,也可定义在类外,本例演示的是类内重载.
//operator 后接运算符号
//运算符的优先级和结合性保持不变.
//不能创建新的运算符,只能重载现有运算符
// 运算符()(也称为函数调用运算符)可以使一个类的对象表现得像函数一样,也称为仿函数
// 一般成员函数的调用是通过对象名.函数名(...)来调用的.  而运算符还是那个运算符,只是表现不一样了.
struct Test1 {constexpr bool operator()() const noexcept {return true;}// 重载()运算符int operator()(int a, int b) const {return a + b;}
};struct Test2 {constexpr operator bool() const noexcept {return true;}
};struct Rational 
{Rational(int num=0,int den=0):_num(num),_den(den){}explicit constexpr operator bool() const noexcept {return _num!=0;} constexpr operator double() const noexcept {return (double)_num/_den;}
private:	int _num;int _den;
};
int main() {Test1 t1;//t1对象有函数调用重载if(t1()) {}      // 需要显式调用,获取其返回值int a1=t1(2,3);printf("a1:%d\n",a1);//t2对象会隐式调用Rational t2(3,5);bool b2 = t2;    // 赋值操作,调用了隐式类型转换, double d2=t2;printf("b2:%d,d2:%f\n",b2,d2);if(t2) {}        // 因if需要bool返回值,所以调用了隐式转换.
}

输出结果:
./temp
a1:5
b2:1,d2:0.600000

本博用实例演示了c++中对函数调用运算符及类型转换运算符的重载.
重载就是重新定义了它的实现.

相关文章:

  • 线程同步学习
  • JSP与JSTL:EL表达式与MVC分层模式的完美结合
  • 3D个人简历网站 5.天空、鸟、飞机
  • 院校机试刷题第五天:1912循环位移、1913礼炮车
  • SQL语句执行问题
  • 使用 Kaniko来构建镜像
  • Mysql 索引概述
  • Vue-事件修饰符
  • 怎么用Origin画出MATLAB效果的3D时频图
  • 哈希表(2):
  • 劳特巴赫trace32烧录方法
  • Compose笔记(二十三)--多点触控
  • JWT令牌验证
  • STM32入门笔记(06):STM32Cube 生态系统 (STM32CubeMX图形工具STM32CubeIDE 集成开发环境)(HAL库)
  • C语言 自定义类型---结构体(1)
  • Redis键(Key)操作完全指南:从基础到高级应用
  • MySQL高可用架构
  • 基于Llama3的开发应用(二):大语言模型的工业部署
  • 基于STM32单片机的高度集成温室环境监测系统设计与实现
  • opencv4.11生成ArUco标记 ArUco Marker
  • 特写|银耳种植“北移”到沧州盐山,村民入伙可年增收4万元
  • 俄媒:俄乌伊斯坦布尔谈判将于北京时间今天17时30分开始
  • 一周文化讲座|“我的生命不过是温柔的疯狂”
  • 浙江省台州市政协原副主席林虹被“双开”
  • 通用汽车回应进口车业务调整传闻:因经济形势变化重组,致力于在中国持续发展
  • 娃哈哈:自4月起已终止与今麦郎的委托代工关系,未来将坚持自有生产模式