C++ 重载(运算符和函数)
C++ 允许在同一作用域内为一个函数名称或运算符指定多个定义,这分别称为函数重载和运算符重载。
重载声明是指在同一作用域内使用与先前声明的声明相同的名称进行声明,但两个声明的参数不同,并且定义(实现)也明显不同。
调用重载的函数或运算符时,编译器会通过将调用函数或运算符时使用的参数类型与定义中指定的参数类型进行比较,来确定最合适的定义。选择最合适的重载函数或运算符的过程称为重载解析。
C++ 中的函数重载
在同一作用域内,同一个函数名可以有多个定义。函数的定义必须在参数列表的类型和/或参数数量上有所不同。不能对仅返回类型不同的函数声明进行重载。
阅读: C++ 函数重载
以下示例使用同一个函数 print() 来打印不同的数据类型 -
#include <iostream> using namespace std; class printData { public: void print(int i) { cout << "Printing int: " << i << endl; } void print(double f) { cout << "Printing float: " << f << endl; } void print(char* c) { cout << "Printing character: " << c << endl; } }; int main(void) { printData pd; // 调用 print 打印整数 pd.print(5); // 调用 print 打印浮点数 pd.print(500.263); // 调用 print 打印字符 pd.print("Hello C++"); return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Printing int: 5 Printing float: 500.263 Printing character: Hello C++
C++ 中的运算符重载
您可以重新定义或重载 C++ 中大多数内置运算符。因此,程序员也可以使用用户定义类型的运算符。
重载运算符是具有特殊名称的函数:关键字"operator"后跟所定义运算符的符号。与其他函数一样,重载运算符具有返回类型和参数列表。
Box 运算符 + (const Box&);
声明一个加法运算符,该运算符可用于将两个 Box 对象相加,并返回最终的 Box 对象。大多数重载运算符可以定义为普通的非成员函数或类成员函数。如果我们将上述函数定义为类的非成员函数,则必须为每个操作数传递两个参数,如下所示 -
Box 运算符 + (const Box&, const Box&);
以下示例使用成员函数展示了运算符重载的概念。这里传递了一个对象作为参数,该对象的属性将通过该对象访问,调用该运算符的对象可以使用 this 运算符访问,如下所述 -
#include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // 重载 + 运算符以添加两个 Box 对象。 Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // box 盒子的长度 double breadth; // box 盒子的宽度 double height; // box 盒子的高度 }; // 程序的主函数 int main() { Box Box1; // 声明 Box1 为 Box 类型 Box Box2; // 声明 Box2 为 Box 类型 Box Box3; // 声明 Box3 为 Box 类型 doublevolume = 0.0; // 在此处存储盒子的体积 // box 1 规范 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // box 2 规范 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // box 1 的体积 volume = Box1.getVolume(); cout << "Box1 的体积:" << volume <<endl; // box 2 的体积 volume = Box2.getVolume(); cout << "Box2 的体积:" << volume <<endl; // 添加两个对象如下: Box3 = Box1 + Box2; // box 3 的体积 volume = Box3.getVolume(); cout << "Box3 的体积:" << volume <<endl; return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Box1 的体积:210 Box2 的体积:1560 Box3 的体积:5400
可重载/不可重载运算符
以下是可重载的运算符列表 -
+ | - | * | / | % | ^ |
& | | | ~ | ! | , | = |
< | > | <= | >= | ++ | -- |
<< | >> | == | != | && | || |
+= | -= | /= | %= | ^= | &= |
|= | *= | <<= | >>= | [] | () |
-> | ->* | new | new [] | delete | delete [] |
以下是不能重载的运算符列表 -
:: | .* | . | ?: |
运算符重载示例
这里有各种运算符重载示例,可以帮助您理解这个概念。
序号 | 运算符 &示例 |
---|---|
1 | 一元运算符重载 |
2 | 二元运算符重载 |
3 | 关系运算符重载 |
4 | 输入/输出运算符重载 |
5 | ++ 和 -- 运算符重载 |
6 | 赋值运算符重载 |
7 | 函数 call () 运算符重载 |
8 | 下标 [] 运算符重载 |
9 | 类成员访问运算符 -> 重载 |