C++ 重载(函数和运算符)

2025 年 4 月 18 日 | 阅读 5 分钟

如果我们创建两个或多个同名但参数数量或类型不同的成员,这称为 C++ 重载。在 C++ 中,我们可以重载

  • 方法,
  • 构造函数,和
  • 索引属性

这是因为这些成员只包含参数。

C++ 中的重载类型有

  • 函数重载
  • 运算符重载
C++ Overloading

C++ 函数重载

函数重载定义为具有两个或多个同名但参数不同的函数的过程,这在 C++ 中称为函数重载。在函数重载中,通过使用不同类型的参数或不同数量的参数来重新定义函数。只有通过这些差异,编译器才能区分这些函数。

函数重载的优点是它增加了程序的可读性,因为您不需要为相同的操作使用不同的名称。

C++ 函数重载示例

让我们看一个简单的函数重载示例,其中我们改变了 add() 方法的参数数量。

// 参数数量不同的函数重载程序。

输出

30
55

让我们看一个参数类型不同的简单示例。

// 参数类型不同的函数重载程序。

输出

r1 is : 42
r2 is : 0.6  

函数重载和歧义

当编译器无法决定在重载函数中调用哪个函数时,这种情况称为函数重载歧义

当编译器显示歧义错误时,编译器不会运行程序。

函数重载的原因

  • 类型转换。
  • 带有默认参数的函数。
  • 带有引用传递的函数。
C++ Overloading
  • 类型转换

让我们看一个简单的例子。

上面的例子显示了一个错误“调用重载的 'fun(double)' 有歧义”。fun(10) 将调用第一个函数。根据我们的预测,fun(1.2) 调用第二个函数。但是,这不引用任何函数,因为在 C++ 中,所有浮点常量都被视为 double 而不是 float。如果我们将 float 替换为 double,程序就会运行。因此,这是从 float 到 double 的类型转换。

  • 带有默认参数的函数

让我们看一个简单的例子。

上面的例子显示了一个错误“调用重载的 'fun(int)' 有歧义”。fun(int a, int b=9) 可以通过两种方式调用:第一种是使用一个参数调用函数,即 fun(12);另一种是使用两个参数调用函数,即 fun(4,5)。fun(int i) 函数使用一个参数调用。因此,编译器无法在 fun(int i) 和 fun(int a,int b=9) 之间进行选择。

  • 带有引用传递的函数

让我们看一个简单的例子。

上面的例子显示了一个错误“调用重载的 'fun(int&)' 有歧义”。第一个函数接受一个整数参数,第二个函数接受一个引用参数。在这种情况下,编译器不知道用户需要哪个函数,因为 fun(int) 和 fun(int &) 之间没有语法差异。

C++ 运算符重载

运算符重载是一种编译时多态性,其中运算符被重载以向用户定义的数据类型提供特殊含义。运算符重载用于重载或重新定义 C++ 中可用的大多数运算符。它用于对用户定义的数据类型执行操作。例如,C++ 提供了添加用户定义数据类型变量的能力,这适用于内置数据类型。

运算符重载的优点是可以在相同的操作数上执行不同的操作。

不能重载的运算符如下

  • 作用域运算符 (::)
  • Sizeof
  • 成员选择器(.)
  • 成员指针选择器(*)
  • 三元运算符(?:)

运算符重载的语法

其中 return type 是函数返回值的类型。

class_name 是类的名称。

operator op 是一个运算符函数,其中 op 是被重载的运算符,operator 是关键字。

运算符重载规则

  • 只能重载现有运算符,不能重载新运算符。
  • 重载运算符至少包含一个用户定义数据类型的操作数。
  • 我们不能使用友元函数来重载某些运算符。但是,可以使用成员函数来重载这些运算符。
  • 当通过成员函数重载一元运算符时,不带显式参数;但如果通过友元函数重载,则带一个参数。
  • 当通过成员函数重载二元运算符时,带一个显式参数;如果通过友元函数重载,则带两个显式参数。

C++ 运算符重载示例

让我们看一个 C++ 中运算符重载的简单示例。在此示例中,定义了 void operator ++ () 运算符函数(在 Test 类内部)。

// 重载一元运算符 ++ 的程序。

输出

The Count is: 10

让我们看一个重载二元运算符的简单示例。

// 重载二元运算符的程序。

输出

The result of the addition of two objects is : 9 
下一主题C++ 函数覆盖