运算符重载

实验05 运算符重载
5.1 实验目的
1.理解掌握成员函数方式运算符重载;
2.理解掌握友元函数方式运算符重载;
3.理解掌握++、–、=运算符的重载。
5.2 实验内容
5.2.1程序阅读
新建一个“实验05 程序阅读答案.docx” 的文档,回答下面的问题。
1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include “iostream.h”

class CComplex
{
public:
CComplex()
{
real = 0;
imag = 0;
}
CComplex(int x,int y)
{
real = x;
imag = y;
}

int real;
int imag;

CComplex operator + (CComplex obj1)-----------------------------------------------①
{
	CComplex obj2(real + obj1.real, imag + obj1.imag);
	return obj2;
}

};

void main()
{
CComplex obj1(100,30);
CComplex obj2(20, 30);
CComplex obj;
obj = obj1+obj2; ------------------------------------------------------------------②
cout << obj.real <<endl;
cout << obj.imag << endl;
}
问题一:①处的运算符重载,为什么该函数的返回值要设计成CComplex类型?——复数相加后仍是复数,要设计成原来的复数类型。
问题二:②处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);”,但是为什么CComplex类中的运算符重载函数只设计了一个参数?重载运算符之后,可以用运算符的简捷方式调用重载版本。——此处调用的函数是成员运算符重载函数,形参表中只有一个参数,它作为运算符右操作数,另一个操作数数是当前对象obj1.
2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include “iostream.h”

class CComplex
{
public:
CComplex()
{
real = 0.0;
imag = 0.0;
}
CComplex(float x, float y)
{
real = x;
imag = y;
}
CComplex operator + (CComplex &obj1, CComplex &obj2)
{
CComplex obj3(obj1.real + obj2.real, obj1.imag + obj2.imag);
return obj3;
}
CComplex &operator++(CComplex &obj)
{
obj.real += 1;
obj.imag +=1;
return obj;
}
void print()
{
cout<<real<<"+"<<imag<<“i”<<endl;
}
private:
float real;
float imag;
};

CComplex &operator–(CComplex &x)
{
x.real -= 1;
x.imag -= 1;
return x;
}

void main()
{
CComplex obj1(2.1,3.2);
CComplex obj2(3.6,2.5);
cout<<“obj1=”;
obj1.print();
cout<<“obj2=”;
obj2.print();
CComplex obj3 = obj1 + obj2;
cout<<“befor++, obj3=”;
obj3.print();
++obj3;
cout<<“after++, obj3=”;
obj3.print();
–obj3;
cout<<“after–, obj3=”;
obj3.print();
CComplex obj4 = ++obj3;
cout<<“obj4=”;
obj4.print();
}问题一:以上程序中的三个运算符重载都有错误,试改正过来,并分析该出结果。1、把函数CComplex&operator–(CComplex&x)在类中定义为友元函数这样就可以调用私有成员,达到“–”2、CComplex operator+(CComplex&obj1,CComplex&obj2)中把其中一个引用去掉,成员运算符重载函数只能有一个形参,另一个是当前对象。把下一句中的一个obj去掉。3、CComplex&operator+(CComplex&obj1,CComplex&obj2),用this指针返回当前值。

5.2.2 程序设计
1.定义CPoint类,有两个成员变量:横坐标(x)和纵坐标(y),用成员函数对CPoint类重载“++”(自增运算符)、“–”(自减运算符),实现对坐标值的改变。程序保存在sy05_1.cpp中。

2.把5.2.1中第一道题的程序改造成采取友元函数重载方式来实现“+”运算符,并采取友元函数重载方式增加前置和后置“++”以及“–”运算符重载,并设计主函数来验证重载运算符的用法。程序保存在sy05_2.cpp中。

  1. 请设计一个数组类,可以实现数据的输入、排序、输出、自增运算、自减运算、相加、赋值等操作。程序保存在sy05_3.cpp中。下面已给出类的结构,
    class Array //定义数组类
    {
    private:
    int ap ; int len ;
    public:
    Array( int size ); // 建立数组
    Array();
    ~Array(); // 析构函数
    Array(const Array &p); //复制构造函数
    void Input();//输入内容
    void Sort();// 排序
    void Print();//输出函数的内容
    int &operator[] (int); //重载运算符[]
    Array operator+(const Array & other);//重载算符 +函数
    Array &operator=(const Array & other);// 重载算符 =函数
    Array operator++();//重载自增运算符,前置自增
    Array operator++(int a);//重载自增运算符,后置自增
    };
    //
    ****************************************************************
    //请把各成员函数补充完成

//*****************************************************************
如在主函数里可以进行下面的运算和输出:
int main()
{ Array a(3) , b(3) ,c(3); // 声明对象
a.Input();
b.Input();
a.Print();
b.Print();
++a;
a.Print();
c=(a++);
c.Print();

cout<<“a的内容为:”; a.Print();
cout<<“b的内容为:”; b.Print();
c=(a + b) ; // 数组相加
cout<<“c=a+b后,c的内容为:”; c.Print();
a=c+b+a;
a.Print();
b.Print();
c.Print();
return 0;
}

5.3实验提交
把 实验05 程序阅读答案.docx 、sy05_1.cpp、sy05_2.cpp、sy05_3.cpp提交。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值