欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++运算符重载实例(以购物车为例)

程序员文章站 2022-03-31 09:31:03
刚刚逛了半天京东。。。干脆以购物车为例。 现在我们有一个类叫做购物车(shopping cart简称SC)。想不出什么功能,就简单点:就一个输出总费用的功能,大概这样。然后我现在...

刚刚逛了半天京东。。。干脆以购物车为例。

现在我们有一个类叫做购物车(shopping cart简称SC)。想不出什么功能,就简单点:就一个输出总费用的功能,大概这样。然后我现在车里有个iPad Air 2。

[cpp] view plain copy

#include<iostream>  

using namespace std;  

class SC  

{  

    int price;  

public:  

    SC(int p=0)  

    {  

        price = p;  

    }  

    ~SC(){}  

    void show()  

    {  

        cout<<price<<endl;  

    }  

};  

int main()  

{  

    SC iPadAir2(2458);     

}  

        现在我要往车里加东西,在类里面添加一个求和的功能。

[cpp] view plain copy

int add(SC a)  

{  

    price += a.price;  

    return price;  

}  

        为了使用的时候少打add跟括号,现在重载+运算符,把add改成operator+即可。

[cpp] view plain copy

int operator+(SC a)  

{  

    price += a.price;  

    return price;  

}  

        现在可以直接使用SC1 + SC2了。

        在这里,operator+函数是类的成员函数。

        下面,假设我觉得一台ipad不够用,我要给家人一人买一台,需要加一个乘法功能。

[cpp] view plain copy

int operator*(int n)  

{  

    return price*n;  

}  

        现在,cout<<iPadAir2*3;是没有问题的,但输出3*iPadAir2会报错。原因是:operator*是类的成员函数,重载后

左操作数必须是调用对象,但常理上iPadAir2*3与3*iPadAir2应该是等价的,用友元函数就可以很好地解决这个问题。

[cpp] view plain copy

friend int operator*(int n,SC &a)  

{  

    a = a*n;  

    return a.price;  

}  

        类的友元函数是非成员函数,但其访问权限与成员函数相同。

        友元常用于重载<<运算符,便于用cout对类进行输出。若不使用友元,而使用成员函数重载<<替代show函数,

函数代码如下:

[cpp] view plain copy

void operator<<(ostream &c)  

{  

    cout<<price<<endl;  

}  

        这样的缺陷是,因为调用对象必须为左操作数,故使用时必须写作iPadAir2<<cout; 十分怪异。

        利用友元反转操作数顺序即可达到预期效果:

[cpp] view plain copy

friend void operator<<(ostream &c,SC a)  

{  

    cout<<a.price<<endl;  

}  

        现在还存在的一个问题是,无法像输出基本类型时那样一次输出多个数,即不能cout<<iPadAir2<<iPadAir2;

        现在看一下<<运算符的定义: 其左边必须是一个ostream对象,如cout<<1;显然满足这一点。我们都知道,

        cout<<1<<2;是可行的,这意味着2前面的<<运算符左边的cout<<1是一个ostream对象,于是乎只要将

operator<<()函数的返回类型改为对ostream对象的引用即可。

[cpp] view plain copy

friend ostream& operator<<(ostream &c,SC a)  

{  

    cout<<a.price<<endl;  

}  

        睡了睡了,明天再看。