zoukankan      html  css  js  c++  java
  • 二元运算符重载

    以非成员函数方式重载运算符

    /***
    overtwo.cpp
    ***/
    #include<iostream>
    using namespace std;
    
    class Box
    {
        public:
            Box(double l = 2.0,double b = 2.0,double h = 2.0)
            {
                length = l;
                breadth = b;
                height = h;
            }
            double getVolume()
            {
                return length*breadth*height;
            }
        private:
            double length;
            double breadth;
            double height;
        friend Box operator+(const Box& a,const Box& b);
    };
    
    Box operator+(const Box& a,const Box& b)
    {
        Box box;
        box.length = a.length+b.length;
        box.breadth = a.breadth+b.breadth;
        box.height = a.height + b.height;
        return box;
    }
    
    int main()
    {
        Box box1(3.3,1.2,1.5);
        Box box2(8.5,6.0,2.0);
        Box box3;
        double volume = 0.0;
    
        volume = box1.getVolume();
        cout << "Volume of box1 : " << volume << endl;
    
        volume = box2.getVolume();
        cout << "Volume of box2 : " << volume << endl;
    
        box3 = box1 + box2;
    
        volume = box3.getVolume();
        cout << "Volume of box3 : " << volume << endl;
    
        return 0;
    }

    运算结果:

    exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ overtwo.cpp -o overtwo

    exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overtwo

    Volume of box1 : 5.94

    Volume of box2 : 102

    Volume of box3 : 297.36

    当两个对象相加时是没有顺序要求的,但是要重载+让其与一个数字相加有顺序要求,可以通过加一个友元函数使另一个顺序的输出合法。

    /***
    overfriend.cpp
    ***/
    #include<iostream>
    using namespace std;
    
    class A
    {
        private:
            int a;
        public:
            A();
            A(int n);
            A operator+(const A &obj);
            A operator+(const int b);
        friend A operator+(const int b,A obj);
            void display();
    };
    
    A::A()
    {
        a = 0;
    }
    
    A::A(int n)
    {
        a = n;
    }
    
    A A::operator +(const A& obj)  //重载+号,用于对象相加
    {
        return this->a+obj.a;
    }
    
    A A::operator+(const int b) //对象和数相加
    {
        return A(a+b);
    }
    
    A operator+ (const int b, A obj) // 友元函数调用第二个重载+的成员函数,相当于obj.operator(b)
    {
        return obj+b;
    }
    
    void A::display()
    {
        cout << a << endl;
    }
    
    int main()
    {
        A a1(1);
        A a2(2);
        A a3,a4,a5;
        a1.display();
        a2.display();
        int m = 1;
        a3 = a1 + a2; //可以调换顺序,相当于a3=a1.operator+(a2);
        a3.display();
    
        a4 = a1 + m; //加了一个友元函数可调换顺序
        a4.display();
    
        a5 = m + a1;
        a5.display();
    
        return 0;
    }

    运算结果:

    exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overfrined

    1

    2

    3

    2

    2

  • 相关阅读:
    《大型网站技术架构》学习笔记——架构演化
    ASP.NET MVC之Html.RenderAction
    设计模式学习笔记——面向对象设计原则
    设计模式学习笔记——类图
    观察者模式
    泛型接口
    泛型的实例化应用
    多线程第二种方式-实现runnable
    对象中的某个属性不希望被序例化--transient
    对象序例化
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11319659.html
Copyright © 2011-2022 走看看