编程语言

面向对象程序设计-运算符重载(2020-04-06)

2020-04-06  本文已影响0人  _NewMoon

当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义,合适的使用运算符重载可以提高代码的可读性!

运算符重载

重载运算符函数的参数数量于该运算符作用的运算对象数量一样多,但若该运算符重载函数是成员函数,则它的第一个运算对象绑定到this指针上,所以成员运算符函数的(显式)参数数量比运算对象的数量少一个。

Tips:

成员函数还是非成员函数

当我们定义重载的运算符时,需要考虑是将其声明为类的成员函数还是非成员函数,下面给出《C++Primer》上给出的判断准则:

下面通过重载输入输出运算符来熟悉一下上面的内容:

重载输入输出运算符

#include <iostream>

using namespace std;

class Sales_data{
private:
    int a,b,c;
    //输出一个对象的数据成员不会改变对象的状态,所以这里用const Sales_data&
    friend ostream &operator<<(ostream &os,const Sales_data& a);
    //输入的值会改变对象的数据成员,所以这里不用const
    friend istream &operator>>(istream &is,Sales_data& a);
public:
    Sales_data():a(0),b(0),c(0){};
    Sales_data(int a,int b,int c):a(a),b(b),c(c){};
    ~Sales_data(){cout<<"~Sales_data"<<endl;}
};
ostream &operator<<(ostream &os,const Sales_data& a){
    os<<a.a<<" "<<a.b<<" "<<a.c<<endl;
    return os;
}
istream &operator>>(istream &is, Sales_data &a){
    int t;
    is >> a.a>>a.b>>t;
    //这个if语句用来检查输入是否成功
    if(is)
        a.c = a.a + a.b + t;
    //如果不成功,对象被赋予默认的状态
    else
        a = Sales_data();
}

int main()
{
    Sales_data b(1,2,3);
    cin>>b;
    cout<<b;
    return 0;
}

对于上面这段代码,我们可以看出,输入输出运算符必须是非成员函数,这两个运算符重载函数的第一个参数都是非常量流的引用,另外,它们都访问了Sales_data对象的私有成员,所以我们需要将它们声明为友元

上一篇 下一篇

猜你喜欢

热点阅读