C++ operator关键字的使用(重载运算符、仿函数、类型转换操作符)

简介: C++ operator关键字的使用(重载运算符、仿函数、类型转换操作符)


定义

C++11 中,operator 是一个关键字,用于重载运算符。通过重载运算符,您可以定义自定义类型的对象在使用内置运算符时的行为。

operator重载用法一般可以分为以下三类:

  • operator可以重载我们运算符“±*/=”等;
  • 还可以重载我们的函数调用运算符"operator()";
  • 还可以做类型转换运算符

operator重载运算符

常见用法:

#include <iostream>
class MyNumber {
private:
  int value;
public:
  MyNumber(int num) : value(num) {}
  int getValue() const {
    return value;
  }
  // 重载加法运算符 '+'
  MyNumber operator+(const MyNumber& other) {
    int sum = value + other.value;
    return MyNumber(sum);
  }
};
int main() {
  MyNumber num1(5);
  MyNumber num2(10);
  MyNumber sum = num1 + num2;  // 使用重载的加法运算符进行相加操作
  std::cout << "Sum: " << sum.getValue() << std::endl;
  return 0;
}

可以看到MyNumber sum = num1 + num2;看起来是对象相加,其实是进入了重载的+运算符,相加的是对象中的成员变量。

operator重载函数调用运算符

class Adder {
public:
  int operator()(int a, int b) {
    return a + b;
  }
};
// 使用函数对象进行加法运算
Adder add;
int result = add(3, 4);  // 调用 operator(),返回结果 7

看起来add就和函数一样,但其实不然,只是重载函数调用运算符后,可以让实例化的add对象像函数一样使用。这也被称为仿函数(这个词算是非常形象了)。

operator类型转换操作符

类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。

class MyType {
public:
  using fr_t = void(*)(int);
  static void func(int a)
  {
    std::cout << "the value:" << a << std::endl;
  }
  operator fr_t() {
  // 执行适当的转换操作
  // 将 MyType 转换为 fr_t
  return func;//这里是将函数指针赋给了fr_t
  }
};
// 使用类型转换运算符进行类型转换
MyType obj;
obj(2);  // 这里涉及到两步动作:一是调用 operator fr_t(),将 obj 转换为 fr_t 类型;二是调用了fr_t(2)

原理:转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空;返回值是隐含的,返回值是与转换的类型相同的,即为上面原型中的函数指针类型fr_t,以及返回的函数func必须对应起来;

obj(2);这行代码的执行过程有点难理解,可分为两步:

  • 一是调用 operator fr_t(),将 obj 转换为 fr_t 类型;
  • 二是调用了fr_t(2); 这里fr_t函数指针已经指向了func,所以可以直接调用。
目录
相关文章
|
11天前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
23 1
|
16天前
|
程序员 编译器 C++
C++中的运算符重载(Operator Overloading)
C++中的运算符重载(Operator Overloading)
27 1
|
9天前
|
编译器 C++
C++运算符的重载
C++运算符的重载
7 0
|
11天前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
10 2
|
16天前
|
C++
C++中使用namespace关键字定义和访问命名空间的技术性探讨
C++中使用namespace关键字定义和访问命名空间的技术性探讨
14 3
|
18天前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
23 5
|
18天前
|
设计模式 编译器 Linux
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(中)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
18 0
|
18天前
|
安全 编译器 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(上)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
22 0
|
20天前
|
C++
c++运算符
c++运算符
27 2
|
20天前
|
程序员 编译器 C++
c++重载运算符和重载函数
c++重载运算符和重载函数
20 1

热门文章

最新文章