📜  C++中的运算符重载类型

📅  最后修改于: 2021-05-30 15:03:38             🧑  作者: Mango

运算符重载:

这可以通过声明函数来实现,其语法为:

Return_Type classname :: operator op(Argument list)
{
    Function Body
}

在上面的语法中, Return_Type是要返回到另一个对象的值类型, operator op是函数,其中operator是关键字,而op是要重载的运算符。

操作员函数必须是非静态的(成员函数)或朋友函数。

操作员重载可以通过三种方法来完成,它们是

  1. 重载一元运算运算符。
  2. 重载二元运算符。
  3. 使用朋友函数重载二进制运算符。

以下是定义运算符函数的一些标准/规则:

  • 如果是非静态函数,则二元运算符应仅具有一个参数,一元运算符不应具有参数。
  • 对于朋友函数,二元运算符应仅具有两个参数,一元运算符应仅具有一个参数。
  • 如果实现了运算符重载,则所有类成员对象都应该是公共的。
  • 不能重载的运算符是 。* :: ?:
  • 将函数声明为好友函数= () [] ->时,不能使用运算符重载。

请参阅此,以了解更多操作员重载规则

  1. 重载一元运算符:让我们考虑重载(-)一元运算运算符。在一元运算运算符函数,不应传递任何参数。它仅适用于一个类对象。它是对单个操作数进行操作的运算符的重载。

    例子:
    假设距离类采用两个成员对象,即英尺和英寸,则创建一个函数,距离对象应通过该函数将英尺和英寸的值减1(具有距离类型的单个操作数)。

    // C++ program to show unary operator overloading
    #include 
      
    using namespace std;
      
    class Distance {
    public:
      
        // Member Object
        int feet, inch;
      
        // Constructor to initialize the object's value
        Distance(int f, int i)
        {
            this->feet = f;
            this->inch = i;
        }
      
        // Overloading(-) operator to perform decrement
        // operation of Distance object
        void operator-()
        {
            feet--;
            inch--;
            cout << "\nFeet & Inches(Decrement): " << feet << "'" << inch;
        }
    };
      
    // Driver Code
    int main()
    {
        // Declare and Initialize the constructor
        Distance d1(8, 9);
      
        // Use (-) unary operator by single operand
        -d1;
        return 0;
    }
    
    输出:
    Feet & Inches(Decrement): 7'8
    

    在上面的程序中,它表明没有传递任何参数并且没有返回return_type值,因为一元运算运算符对单个操作数起作用。 (-)运算符将功能更改为其成员函数。

    注意: d2 = -d1将不起作用,因为运算符-()不返回任何值。

  2. 重载二元运算符:在二元运算符重载函数,应传递一个参数。这是对两个操作数进行操作的运算符的重载。

    让我们以距离类的相同示例为例,但是这次添加两个距离对象。

    // C++ program to show binary operator overloading
    #include 
      
    using namespace std;
      
    class Distance {
    public:
        // Member Object
        int feet, inch;
        // No Parameter Constructor
        Distance()
        {
            this->feet = 0;
            this->inch = 0;
        }
      
        // Constructor to initialize the object's value
        // Parametrized Constructor
        Distance(int f, int i)
        {
            this->feet = f;
            this->inch = i;
        }
      
        // Overloading (+) operator to perform addition of
        // two distance object
        Distance operator+(Distance& d2) // Call by reference
        {
            // Create an object to return
            Distance d3;
      
            // Perform addition of feet and inches
            d3.feet = this->feet + d2.feet;
            d3.inch = this->inch + d2.inch;
      
            // Return the resulting object
            return d3;
        }
    };
      
    // Driver Code
    int main()
    {
        // Declaring and Initializing first object
        Distance d1(8, 9);
      
        // Declaring and Initializing second object
        Distance d2(10, 2);
      
        // Declaring third object
        Distance d3;
      
        // Use overloaded operator
        d3 = d1 + d2;
      
        // Display the result
        cout << "\nTotal Feet & Inches: " << d3.feet << "'" << d3.inch;
        return 0;
    }
    
    输出:
    Total Feet & Inches: 18'11
    

    在上面的程序中,
    见行号26Distance operator+(Distance &d2) ,这里函数的返回类型是distance,它使用引用调用来传递参数。
    见行号49d3 = d1 + d2;在这里,D1调用它的类对象的运算符函数,并采用D2作为参数,通过运算符函数返回的对象,结果将在D3对象反映。

    二元运算符工作原理图:
    操作员

  3. 使用Friend函数重载Binary运算符:在这种方法中,运算符重载函数必须以friend关键字开头,并声明一个函数类范围。请记住,Friend运算符函数在一个二进制运算符采用两个参数,在一个一元运算运算符改变一个参数。所有工作和实现都将与二进制运算符函数相同,只是此函数将在类范围之外实现。

    让我们使用friend函数举一个相同的例子。

    // C++ program to show binary operator overloading
    #include 
      
    using namespace std;
      
    class Distance {
    public:
      
        // Member Object
        int feet, inch;
      
        // No Parameter Constructor
        Distance()
        {
            this->feet = 0;
            this->inch = 0;
        }
      
        // Constructor to initialize the object's value
        // Parametrized Constructor
        Distance(int f, int i)
        {
            this->feet = f;
            this->inch = i;
        }
      
        // Declaring friend function using friend keyword
        friend Distance operator+(Distance&, Distance&);
    };
      
    // Implementing friend function with two parameters
    Distance operator+(Distance& d1, Distance& d2) // Call by reference
    {
        // Create an object to return
        Distance d3;
      
        // Perform addition of feet and inches
        d3.feet = d1.feet + d2.feet;
        d3.inch = d1.inch + d2.inch;
      
        // Return the resulting object
        return d3;
    }
      
    // Driver Code
    int main()
    {
        // Declaring and Initializing first object
        Distance d1(8, 9);
      
        // Declaring and Initializing second object
        Distance d2(10, 2);
      
        // Declaring third object
        Distance d3;
      
        // Use overloaded operator
        d3 = d1 + d2;
      
        // Display the result
        cout << "\nTotal Feet & Inches: " << d3.feet << "'" << d3.inch;
        return 0;
    }
    
    输出:
    Total Feet & Inches: 18'11
    

    在这里,在上述程序中,运算符函数由宣称函数作为朋友函数实现类范围之外。

在这些方式中,运算符可以被重载通过改变运算符的功能,以执行某些任务。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”