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;
     
       // 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++
    
    编译并执行上述代码后,将产生以下结果-
    
    Total area: 35
    
  • C++中的运算符重载

    您可以重新定义或重载C++中可用的大多数内置运算符。因此,程序员也可以将运算符与用户定义的类型一起使用。重载的运算符是具有特殊名称的函数:关键字“ operator”,后跟所定义的运算符的符号。像任何其他函数一样,重载运算符具有返回类型和参数列表。
    
    Box operator+(const Box&);
    
    声明可用于添加两个Box对象的加法运算符,并返回最终的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[]
    以下是运算符的列表,不能重载-
    :: .* . ? :