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

C++重载(函数和运算符)
如果我们创建两个或更多具有相同名称但参数数量或类型不同的成员,这被称为C++重载。在C++中,我们可以重载:
- 方法
- 构造函数和
- 索引属性
这是因为这些成员只有参数。
C++中的重载类型有:
- 函数重载
- 运算符重载
C++函数重载
函数重载被定义为具有相同名称但参数不同的两个或更多函数的过程,在C++中被称为函数重载。在函数重载中,通过使用不同类型的参数或不同数量的参数重新定义函数。只有通过这些差异编译器才能区分这些函数。
函数重载的优点是它增加了程序的可读性,因为您不需要为相同的操作使用不同的名称。
C++函数重载示例
让我们看一个简单的函数重载示例,其中我们改变了add()方法的参数数量。
// 当参数数量不同时的函数重载示例代码。
#include <iostream>
using namespace std;
class Cal {
public:
static int add(int a, int b) {
return a + b;
}
static int add(int a, int b, int c) {
return a + b + c;
}
};
int main(void) {
Cal C; // 类对象声明。
cout << C.add(10, 20) << endl;
cout << C.add(12, 20, 23);
return 0;
}
输出:
30 55
让我们看一个简单的例子,当参数类型不同时。
// 带有不同类型参数的函数重载示例程序。
#include<iostream>
using namespace std;
int mul(int, int);
float mul(float, int);
int mul(int a, int b)
{
return a * b;
}
float mul(double x, int y)
{
return x * y;
}
int main()
{
int r1 = mul(6, 7);
float r2 = mul(0.2, 3);
std::cout << "r1 is : " << r1 << std::endl;
std::cout << "r2 is : " << r2 << std::endl;
return 0;
}
输出:
r1 is : 42
r2 is : 0.6
函数重载和二义性
当编译器无法确定在重载的函数中应调用哪个函数时,这种情况被称为函数重载。
当编译器显示二义性错误时,编译器不会运行程序。
函数重载的原因:
- 类型转换。
- 带有默认参数的函数。
- 带有按引用传递的函数。
- 类型转换:
让我们看一个简单的例子。
#include<iostream>
using namespace std;
void fun(int);
void fun(float);
void fun(int i)
{
std::cout << "i的值为:" << i << std::endl;
}
void fun(float j)
{
std::cout << "j的值为:" << j << std::endl;
}
int main()
{
fun(12);
fun(1.2);
return 0;
}
上面的例子显示错误"call of overloaded 'fun(double)' is ambiguous"。fun(10)将调用第一个函数。根据我们的预测,fun(1.2)调用第二个函数。但是,这不引用任何函数,因为在C++中,所有浮点常量都被视为double而不是float。如果我们将float替换为double,程序将正常工作。因此,这是从float到double的类型转换。
- 带有默认参数的函数
让我们看一个简单的例子。
#include<iostream>
using namespace std;
void fun(int);
void fun(int, int);
void fun(int i)
{
std::cout << "i的值为:" << i << std::endl;
}
void fun(int a, int b = 9)
{
std::cout << "a的值为:" << a << std::endl;
std::cout << "b的值为:" << b << std::endl;
}
int main()
{
fun(12);
return 0;
}
上面的例子显示错误"call of overloaded 'fun(int)' is ambiguous"。fun(int a, int b = 9)可以通过两种方式调用:一种是通过一个参数调用函数,即fun(12),另一种是通过两个参数调用函数,即fun(4,5)。fun(int i)函数使用一个参数调用。因此,编译器无法在fun(int i)和fun(int a, int b = 9)之间进行选择。
- 带有引用传递的函数
让我们看一个简单的例子。
#include <iostream>
using namespace std;
void fun(int);
void fun(int &);
int main()
{
int a = 10;
fun(a); // 错误,哪个f()?
return 0;
}
void fun(int x)
{
std::cout << "x的值为:" << x << std::endl;
}
void fun(int &b)
{
std::cout << "b的值为:" << b << std::endl;
}
上面的例子显示错误"call of overloaded 'fun(int&)' is ambiguous"。第一个函数接受一个整数参数,而第二个函数接受一个引用参数。在这种情况下,编译器不知道用户需要哪个函数,因为在fun(int)和fun(int &)之间没有语法上的区别。
C++运算符重载
运算符重载是一种在编译时多态性,其中运算符被重载以为用户定义的数据类型提供特殊含义。运算符重载用于重载或重新定义C++中提供的大多数运算符。它用于对用户定义的数据类型执行操作。例如,C++提供了添加内置数据类型的能力。
运算符重载的优点是可以在相同的操作数上执行不同的操作。
不能重载的运算符如下所示:
作用域运算符(::)
- Sizeof
- 成员选择符(.)
- 成员指针选择符(*)
- 三元运算符(?:)
运算符重载的语法
return_type class_name : : operator op(argument_list)
{
// 函数体
}
其中返回类型是函数返回的值的类型。
class_name是类的名称。
operator op是运算符函数,其中op是要重载的运算符,operator是关键字。
运算符重载的规则
- 只能重载现有的运算符,不能重载新的运算符。
- 重载的运算符至少包含一个用户自定义数据类型的操作数。
- 不能使用友元函数重载某些运算符,但可以使用成员函数重载这些运算符。
- 当一元运算符通过成员函数重载时,不需要显式参数,但如果通过友元函数重载,则需要一个参数。
- 当二元运算符通过成员函数重载时,需要一个显式参数,如果通过友元函数重载,则需要两个显式参数。
C++运算符重载示例
让我们看一个在C++中进行运算符重载的简单示例。在此示例中,定义了void operator++()运算符函数(在Test类内部)。
// 重载一元运算符++的程序。
#include <iostream>
using namespace std;
class Test
{
private:
int num;
public:
Test(): num(8){}
void operator++() {
num = num+2;
}
void Print() {
cout<<"Count 的值为: "<<num;
}
};
int main()
{
Test tt;
++tt; // 调用函数 "void operator++()"
tt.Print();
return 0;
}
输出:
Count 的值为: 10
让我们看一个简单的例子,重载二元运算符。
// 重载二元运算符的程序。
#include <iostream>
using namespace std;
class A
{
int x;
public:
A(){}
A(int i)
{
x=i;
}
void operator+(A);
void display();
};
void A::operator+(A a)
{
cCopy code
int m = x+a.x;
cout<<"两个对象相加的结果为:"<<m;
}
int main()
{
A a1(5);
A a2(4);
a1+a2;
return 0;
}
输出:
两个对象相加的结果为:9