操作符重载

操作符重载在C++的概念中,操作符实际上是一种特殊的函数,因此函数的重载对于操作符同样适用操作符重载的语法:类operator操作符名(参数){}一、类的成员函数的重载1.类中双目运算符的成员函数的重载在类的成员运算符函数重载中,由于默认已经传入一个隐含参数this,因此只需要再传入一个对象即可。

大家好,欢迎来到IT知识分享网。

 

在C++的概念中,操作符实际上是一种特殊的函数,因此函数的重载对于操作符同样适用

操作符重载的语法:

类 operator操作符名(参数){}

一、类的成员函数的重载

1.类中双目运算符的成员函数的重载

在类的成员运算符函数重载中,由于默认已经传入一个隐含参数this,因此只需要再传入一个对象即可。

#include<iostream>
using namespace std;

class Number
{
public:
        Number(int a, int b);
    Number operator+(Number& n);//双目运算符只需要传递一个参数(隐含了一个本类的this指针)
    void in()
        cout << this->a << endl;
        cout << this->b << endl;
    }
private:
    int a, b;
};
 Number::Number(int a, int b)
{
    this->a = a;
    this->b = b;
}

Number Number::operator+(Number& n)
{
     this->a = this->a + n.a;
     this->b = this->b + n.b;
     return *this;
}

int main()
{
    Number a(1, 2);
    Number b(1, 2);
    Number c(2, 2);
    //c = a.operator+(b);
    c = a + b;
    c.in();
    return 0;
}//c=a.operator+(b)与c=a+b同等效果

注意:对于双目运算符而言,a.operator+(b)=a+b;

 

2.类中单目运算符的成员函数的重载

由于单目运算符可能存在前置运算和后置运算两种,因此为了区分前置单目运算符,我们再后置单目运算符的申明中引入虚拟参数int用以区别(仅仅是用来区分,并没有任何实际作用)

2.1前置单目运算符重载

由于同样是在类中,因此单目运算实现对对象本身的操作,不用引入其他参数

class Number
{
public:
    Number(int a = 0, int b = 0);
    Number& operator++();
    void in()
    {
        cout << this->a << endl;
        cout << this->b << endl;
    }
private:
    int a, b;
};

Number& Number::operator++()
{
    this->a = this->a + 1;
    this->b = this->b + 1;
    return *this;
}

 Number::Number(int a, int b)
{
    this->a = a;
    this->b = b;
}


int main()
{
    Number a(1, 2);
    Number b(1, 2);
    Number c;
    //c = a.operator+(b);
    //++c;
    c++;
    cout << c;
    return 0;
}
注意:前置++的语句为 Number& Number::operator++()
{}此处返回类型为类对象的引用,原因是当需要进行连续操作时通常需要返回引用

2.2后置单目运算符重载
由于需要区分前置运算符,后置运算符的重载函数申明时,需要传入一个int虚拟参数,用以区分
class Number
{
public:
    Number(int a = 0, int b = 0);
    Number operator++(int);//虚拟参数int,用来区分前置++的重载

    void in()
    {
        cout << this->a << endl;
        cout << this->b << endl;
    }
private:

    int a, b;
};


Number Number::operator++(int)
{
    return *this;
}


 Number::Number(int a, int b)
{
    this->a = a;
    this->b = b;
}

int main()
{
    Number a(1, 2);
    Number b(1, 2);
    Number c;
    //c = a.operator+(b);
    //++c;
    c++;
    cout << c;
    return 0;
}

 

二、类外普通函数的重载

1.普通函数的双目运算符重载

普通函数的重载和成员函数的重载差异在于,普通函数运算符重载需要多传递一个参数为运算符函数的发起对象(即this的功能)

注意:若需要调用传入的类对象的私有成员成员数据,则需要在对应的类中申明该函数为友元函数。

class Number
{
public:
    Number(int a = 0, int b = 0);
    void in()
    {
        cout << this->a << endl;
        cout << this->b << endl;
    }
private:
    friend Number operator+(Number& x, Number& c);//传入两个对象,实现双目运算的功能
    friend Number operator++(Number& x, int);
    int a, b;
};

Number operator+(Number& x, Number& c)
{
    x.a = x.a + c.a;
    x.b = x.b + c.b;
    return x;
}

ostream& operator<< (ostream&, Number& x)
{
    x.in();
    return cout;
}

Number::Number(int a, int b)
{
    this->a = a;
    this->b = b;
}
int main()
{
    Number a(1, 2);
    Number b(1, 2);
    Number c;
    //c = a.operator+(b);
    //++c;
    c++;
    cout << c;
    return 0;
}

 

2.普通函数的单目运算符重载

2.1前置运算符的单目运算符重载

函数外的函数体:

Number& operator++(Number& x){};

类中申明友元(既可以在共有处申明,也可以在私有处申明)

public:

friend Number& operator++(Number& x);

 

2.2后置运算符的单目运算符重载

函数外的函数体:

Number& operator++(Number& x,int){};

类中申明友元(既可以在共有处申明,也可以在私有处申明)

public:

friend Number& operator++(Number& x,int);

 

3.输入输出运算符的重载

对于输入输出运算符的重载必须用全局的函数实现。如果用类中的成员函数实现输出或输入,如下:

操作符重载

 

 但是我们需要的是:

操作符重载

 

 因此我们传入ostream类,和其他类,通过ostream的对象cout调用<<运算符实现对其他类对象的输出

class Number
{
private:
    int a,b;
public:
    Number(int x, int y)
    {
        a = x;
        b = y;
    }
    friend ostream& operator<<(ostream&, Number& x);
};
ostream& operator<<(ostream&, Number& x)
{
    cout << x.a << endl;
    cout << x.b << endl;
}

注意:由于需要访问传入的Number类的私有成员,因此设置友元函数

 

4.=运算符的函数重载

=运算符只能作为成员函数重载(=、[]、()、->等所有类型转换运算符只能作为成员函数重载)

 

class Number
{
private:
    int a,b;
public:
    Number(int x, int y)
    {
        a = x;
        b = y;
    }
    Number& operator=(Number&x);
};
Number& Number::operator=(Number& x)
{
    this->a = x.a;
    this->b = x.b;
}

注意:=运算符重载常常涉及深浅拷贝的问题,当类的私有成员数据为指针地址时,=需要对类对象进行深拷贝(即重新开辟空间)

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31139.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信