代码改变世界

C++第五次作业

2019-10-27 21:11  jormungandlalala  阅读(204)  评论(0编辑  收藏  举报

C++第五次作业


引言:C++中的预定义的运算符的操作对象只能是基本数据类型。实际上对于用户自定义类型,也需要有类似的运算符操作,如+,-,++,--等,而此时我们想对对象直接进行如a+b的运算是会出错的,那么应该如何实现呢?


运算符重载


运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为(实质:就是函数重载)
运算符重载规则:
1.C++中的运算符除少数几个之外,全部都可以重载,而且只能重载C++中已有的运算符
2.重载之后的运算符的优先级不会改变
3.运算符重载针对的新类型数据的实际需要,对原有运算符进行适当改造,一般来讲,重载的功能应与原功能类似,不能改变原运算符的操作对象个数,同时至少有一个操作对象是自定义类型。
运算符重载语法
1.运算符重载为类的成员函数时语法形式为:

返回类型 operator运算符(形参表)
{
    函数体
}

当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个(后置++,--除外)
2.运算符重载为非成员函数时语法形式为

返回类型 operator运算符(形参表)
{
    函数体
}

当重载为非成员函数时,参数个数与原操作个数相同 注意:当以非成员函数重载运算符时,有时需要访问运算符参数所涉及类的私有成员,这时可以把该函数声明为友元函数
具体例子:(重载为类的成员函数)

#include<iostream>
using namespace std;
class Complex{
public:
    Complex(double r=0.0,double i=0.0):real(r),imag(i){}//构造函数
    Complex operator+(const Complex &c2) const;  //运算符+的重载函数
    Complex operator-(const Complex &c2) const;  //运算符-的重载函数
    void display() const;
private:
    double real;
    double imag;
};
Complex Complex::operator+(const Complex &c2) const   //重载运算符函数实现
{
    return Complex(real+c2.real,imag+c2.imag);  //创建一个无名对象作为返回值
}
Complex Complex::operator-(const Complex &c2) const
{
    return Complex(real-c2.real,imag-c2.imag);
}
void Complex::display() const
{
    cout<<"("<<real<<","<<imag<<")"<<endl;
}

主函数:利用函数实现

int main()
{
    Complex c1(5,4);
    Complex c2(2,10);
    Complex c3;
    cout<<"c1=";c1.display();
    cout<<"c2=";c2.display();
    c3=c1.operator+(c2);
    c3.display();
    c3=c1.operator-(c2);
    c3.display();
    return 0;
}

此时运行结果为:

思考:此时两个对象相加可以同普通数直接相加的写法写吗
实现:

int main()
{
    c3=c1+c2;
    c3.display();
    c3=c1-c2;
    c3.display();
    return 0;
}

因此时的参数后一个是复数,那么可以直接用复数实现吗?

c3=c1-5;
 c3.display();

那么前一个也可以直接用一个复数实现吗

c3=5-c2;
c3.display();

此时可以看到程序报错,因为前一个是参数必须是Complex型,5是不行的

重载为非成员函数:只是操作个数与原操作数个数相同,掌握了重载为类的
成员函数,就可举一反三
具体例子:

#include<iostream>
using namespace std;
class Complex{
public:
    Complex(double r=0.0,double i=0.0):real(r),imag(i){}//构造函数
    friend Complex operator+(const Complex &c1,const Complex &c2) ;  //运算符+的重载函数
    friend Complex operator-(const Complex &c1,const Complex &c2) ;  //运算符-的重载函数
    void display() const;
private:
    double real;
    double imag;
};
Complex operator+(const Complex &c1,const Complex &c2)    //重载运算符函数实现
{
    return Complex(c1.real+c2.real,c1.imag+c2.imag);  //创建一个无名对象作为返回值
}
Complex operator-(const Complex &c1,const Complex &c2)
{
    return Complex(c1.real-c2.real,c1.imag-c2.imag);
}
void Complex::display() const
{
    cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{
    Complex c1(5,4);
    Complex c2(2,10);
    Complex c3;
    cout<<"c1=";c1.display();
    cout<<"c2=";c2.display();
    c3=c1+c2;
    c3.display();
    c3=c1-c2;
    c3.display();
    return 0;
}

运行结果: