重载简述
重载是C++面向对象编程领域的重要概念。C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
对于重载函数而言,有一个基本原则:重载的函数两两之间的参数列表互不相同。参数列表不同是指参数的数量不同,或者参数的类型不同,但C++并不接受参数数量相同且参数类型对应相同(即使参数名称不同)或者仅返回值类型不同的函数重载。
当调用重载的函数或运算符时,编译器将会一一比对参数列表,找到符合要求的函数。这个过程叫做重载决策。
函数重载
函数重载的基本方法是,定义两个或两个以上具有相同名称、参数列表符合函数重载要求的函数。以下是一个实例:
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
请注意:下面的代码
int add(int a, int b)
{
return a + b;
}
double add(int a, int b)
{
return (double)(a + b);
}
是不能通过编译的,报错:
无法重载仅按返回类型区分的函数
即使将第二个add
函数中的a
和b
换成c
和d
,也会出现同样的报错。
运算符重载
如果想要根据不同的功能重载运算符,需要使用operator
关键字。以下是一个实例,展现了对于类实现的对+
的重载:
class node
{
private:
int num;
int weight;
public:
node operator+(const node&);
};
node node::operator+(const node& b)
{
node n;
n.num = this->num + b.num;
n.weight = this->weight + b.weight;
return n;
}
请注意:在某些编译器中(例如VS 2019),不允许原本的运算符可以对重载的运算符的参数进行操作。例如在对+
进行重载时,不允许参数是int
,double
等等诸如此类的基本类型。
不可重载的运算符
以下是不可重载的运算符:
.
成员访问运算符.*
、->*
成员指针访问运算符::
域名解析运算符sizeof
字长运算符?:
条件运算符#
预处理符号