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; // Call print to print integer pd.print(5); // Call print to print float pd.print(500.263); // Call print to print character pd.print("Hello C++"); return 0; }
让我们编译和运行上面的程序,这将产生以下结果:
Printing int: 5 Printing float: 500.263 Printing character: Hello C++
C++运算符重载:
可以重新定义或重载大部分C++提供了内置的运算符。因此,程序员可以使用使用用户定义类型运算符也是如此。
重载运算符使用特殊名称关键字操作之后的操作符号被定义的函数。就像任何其他函数,重载操作符返回类型和参数列表。
Box operator+(const Box&);
声明可用于添加两个框对象并返回最终框对象的加法运算符。大多数重载操作符可以定义为普通非成员函数或类成员函数。如果我们定义上面的函数作为类的非成员函数,那么我们就必须通过两个参数为每个操作数如下:
Box operator+(const Box&, const Box&);
以下是对例如使用成员函数来显示运算符的重载的概念。在这里,一个对象作为参数传递,其属性将使用这个对象,它会调用这个操作符的对象访问可以使用该操作符解释如下访问:
#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; } // Overload + operator to add two Box objects. 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; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; // Main function for the program int main( ) { Box Box1; // Declare Box1 of type Box Box Box2; // Declare Box2 of type Box Box Box3; // Declare Box3 of type Box double volume = 0.0; // Store the volume of a box here // box 1 specification Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // box 2 specification Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // volume of box 1 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // volume of box 2 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // Add two object as follows: Box3 = Box1 + Box2; // volume of box 3 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return 0; }
让我们编译和运行上面的程序,这将产生以下结果:
Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400
重载/非重载运运符:
以下是可以重载运算符的列表:
+ | - | * | / | % | ^ |
& | | | ~ | ! | , | = |
< | > | <= | >= | ++ | -- |
<< | >> | == | != | && | || |
+= | -= | /= | %= | ^= | &= |
|= | *= | <<= | >>= | [] | () |
-> | ->* | new | new [] | delete | delete [] |
以下是运算符的列表,这些运算符是不能被重载:
:: | .* | . | ?: |
操作符重载的例子:
这里有各种操作符重载的例子,以帮助理解的概念。
S.N. | 运算符和示例 |
---|---|
1 | 一元运算符重载 |
2 | 二元运算符重载 |
3 | 关系运算符重载 |
4 | 输入/输出运算符重载 |
5 | ++和 -- 运算符重载 |
6 | 赋值运算符重载 |
7 | 函数call () 操作符重载 |
8 | 下标[]运算符重载 |
9 | 类成员访问操作符->重载 |