运算符重载和友元作业
- 格式:doc
- 大小:34.50 KB
- 文档页数:2
《C++程序设计》实验报告准考证号xxxxxx题目:友元运算符重载和类运算符重载姓名xxx 日期xxx 实验环境:Visual C++ 6.0- 1 -- 2 -实验内容与完成情况实验目的:1,掌握运算符重载的必要性2,掌握友元运算符重载的一般格式3,掌握类运算符重载的一般格式4,掌握重载后的运算符的使用格式实验内容:1,设计一个类定义相关的数据成员和成员函数重载加、减运算符,实现对象的加减运算定义相关函数实现对象中数据的输出显示2,定义成员函数时,将成员函数定义在类体之外3,设计main 函数创建多个对象进行对象的加减运算,并输出运算后对象的数据并输出结果源程序代码://类运算符的重载实现#include <iostream>using namespace std;class base{double ra;double ia;public: base(double r=0,double i=0){ ra=r; ia=i;cout<<"构造base 对象"<<ra<<"+"<<ia<<"i"<<endl;}base operator +(base a){ cout<<"开始+操作->"<<endl;double r=a.ra+ra; double i=a.ia+ ia; base s(r,i);cout<<"完成+操作,实现复数相加"<<endl;return s; }base operator -(base a){ cout<<"开始-操作->"<<endl;double r=a.ra-ra; double i=a.ia-ia; base s(r,i);cout<<"完成-操作,实现复数相减"<<endl;return s; }void show(){ cout<<"对象中存放的复数值为:"<<ra<<"+"<<ia<<"i"<<endl; }}; void main(){ base c1(2,6),c2(3,2),c3,c4;c3=c2.operator+(c1); c3.show();c4=c1+c2;c4.show();出现的问题解决方案(列出遇到的问题和解决办法,列出未解决的问题)- 3 -。
HZAU-专业C++作业13(运算符重载)判断题1. 所有的运算符都可以重载。
F2.在C++中,编译时的多态性是通过函数和运算符的重载实现的。
T3. 运算符重载是通过对已有的运算符重新定义操作功能来实现的,它是C++语言多态性的一种表现。
T4. 运算符重载只可以是类的成员函数和友元函数,不可以是普通函数。
T5. 运算符重载是通过函数来实现的,定义运算符重载函数时,函数名中要使用关键字operator。
T6. 运算符重载后,优先级、结合性和操作数都是不变的。
T7. 重载运算符的函数也可以设置默认参数。
F8. 使用成员函数方法和使用友元函数的方法所定义的重载运算符函数的参数个数是不相同的。
T9. 运算符“.”、“::” 、“?:” 不能重载T10. 运算符=、()、[]和->可作为类成员运算符, 不能作为友员运算符。
T选择题1.下列运算符中,(A )运算符在C++中不能重载。
A. ?:B. [ ]C. newD. &&2.下列运算符不能用友元函数重载的是(c)。
A. +B. =C. *D. <<3.在一个类中可以对一个操作符进行( D )重载。
A. 1种B. 2种及以下C. 3种及以下D. 多种4.友元运算符obj1>obj2被C++编译器解释为( A )。
A. operator > (obj1, obj2)B. > (obj1, obj2)C. obj2.operator > (obj1)D. obj1.operator > (obj2)5.下列关于C++运算符函数的返回类型的描述中,错误的是( C )。
A. 可以是类类型B. 可以是int类型C. 可以是void类型D. 可以是float类型6.下列关于运算符重载的描述中,正确的是( D )。
A. 运算符重载可以改变运算符的操作数的个数B. 运算符重载可以改变优先级C. 运算符重载可以改变结合性D. 运算符重载不可以改变语法结构7.先加一然后再使用的++运算符的重栽形式是(A)。
1、重新编写所有的Time类范例,使用友元函数来实现所有的重载操作符号。
2、复数由两个部分组成:实数部分和虚数部分。
复数的一种书写方式是:(3.0, 4.0),其中,3.0是实数部分,4.0是虚数部分。
假设a=(A,Bi),c=(C,Di),则下面是一些复数运算:A、加法:a+c = (A + C,(B+D)i)B、减法:a-c = (A - C,(B-D)i)C、乘法:a*c = (A *C – B*D,(A*D + B*C)i)D、乘法:x * c=( x*C, x*Di), 其中x 为实数E、共轭:~a = (A, -Bi)请定义一个复数类,以便下面的程序可以使用它来获得正确的结果:#include <iostream>Using namespace std;#include “complex0.h”Int main(){Complex a(3.0, 4.0); // 初始化一个复数Complex c;Cout << “Enter a Complex number (q to quit): \n”;While (cin >> c){Cout << “ c is ” << c<< ‘\n’;Cout << “C omplex conjugate is” << -c << ‘\n’;Cout << “a is” << a<< ‘\n’;Cout << “a + c is” << a + c<< ‘\n’;Cout << “a - c is” << a - c<< ‘\n’;Cout << “a * c is” << a * c<< ‘\n’;Cout << “2 * c is” << 2 * c<< ‘\n’;Cout << “Enter a Complex number (q to quit): \n”;}Cout << “Done!” << endl;Return 0;}注意,必须重载<< 和>> 操作符。
面向对象程序设计C++——第6章 运算符重载与友元主要内容⏹运算符重载的目的、定义和实质⏹运算符重载的规则⏹运算符重载的两种形式⏹友元的作用和定义⏹类型转换运算符重载2提出问题⏹复数的加减运算问题:⏹对于非基本数据类型,如复数、分数,如何在程序中进行运算?⏹能否直接用运算符(+、-、*、/)进行运算?3分析问题⏹自定义一个复数类Complex完成复数的加减运算⏹设计复数类class Complex//复数类{public:Complex(double r=0.0,double i=0.0) //构造函数{ real=r; image=i; }private: double real, image; //定义实部、虚部};45思考是否能通过下面的代码完成复数的加减运算:int main(){//定义一个复数对象c1,其实部为2,虚部为2.5 Complex c1(2, 2.5);Complex c2(3, 1.4);Complex c3, c4;c3 = c1 + c2;c4 = c1 - c2;return 0;}说明⏹C++预定义的“+”、“-”运算只支持基本数据类型,并不支持用户自定义类型。
⏹复数类的加减运算不能采用系统预定义的运算符“+”、“-”完成,那么编写成员函数来实现加、减运算。
6重新设计复数类Complexclass Complex {public:Complex(double r=0.0,double i=0.0) //构造函数{ real=r; image=i; }double Real(){return real;} //返回复数的实部double Imag(){return image;}//返回复数的虚部Complex add(Complex &c); //函数重载,实现复数加复数Complex add(double d); //函数重载,实现复数加实数Complex sub(Complex &c); //函数重载,实现复数减复数Complex sub(double d); //函数重载,实现复数减实数private:double real, image; //定义实部、虚部};7成员函数定义完成复数与复数相加Complex Complex::add(Complex &c){Complex temp;temp.real = real + c.real;temp.image = image + c.image;return temp;}8完成复数与实数相加Complex Complex::add(double d){Complex temp;temp.real = real + d;temp.image = image;return temp;}9int main(){Complex c1(2, 2.5);不如c3=c1+c2直观!Complex c2(3, 1.4);Complex c3, c4;c3=c1.add(c2);c4=c1.sub(c2);cout<<"c3= "<<c3.Real() <<" +i "<<c3.Imag()<<endl;cout<<"c4= "<<c4.Real()<<" +i "<<c4.Imag()<<endl;return 0;}10运算符重载⏹运算符重载就是为用户自定义类型重新定义运算符,使同一个运算符既可以作用于预定义的数据类型,也可以作用于用户自定义的数据类型。
运算符重载一.单项选择题1.下列运算符中,运算符在C++中不能重载。
A.?:B.+C.D.<=解:C++中不能被重载的运算符有:·,一,::,?:。
本题答案为A。
2.下列运算符中,运算符在C++中不能重载。
A.&&B.[]C.::D.new解:c++中不能被重载的运算符有:·,·+,::,?:。
本题答案为c。
3.下列关于运算符重载的描述中,是正确的。
A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构解:运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算程的语法结构。
本题答案为D。
4.友元运算符objl>obj2被C++编译器解释为。
A.operator>(objl,obj2) B.>(obj1,obj2)C.obj2.operator:>(obj1) D.objl.operator>(obj2)解:重载为友元函数的运算符的调用形式如下:operator<运算符>(<参数,<参数2>)等价于:<参数1><运算符><参数2>本题答案为A。
5.现需要对list类对象使用的逻辑运算符“==”重载,以下函数声明是正确的。
A、list&list::operator==(const list&a) ;B、list list::operator==(const list&a) ;C、bool&list::operator==(const list&a);D、bool list::operator==(const list&a);6.以下类中分别说明了“+=”和“++”运算符重载函数的原型。
如果主函数中有定义:fun m,c,d;,那么,执行语句c=m++;时,编译器把m++解释为:(3)A)c.o p e r a t o r++(m);B)m=o p e r a t o r++(m);C)m.o p e r a t o r++(m);D)o p e r a t o r++(m);class fun{public:....f u n o p e r a t o r+=(f u n);f r i e n d f u n o p e r a t o r++(f u n&,i n t);};答案:D7.在第33题中,当执行语句d+=m;时,C++编译器对语句作如下解释:(34)A.d=operator+=(m);B.m=operator+=(d);C. d.operator+=(m);D.m.operator+=(d);答案:C8.设有以下类定义,其中说明了“+”运算符重载函数的原型。
1、重新编写所有的Time类范例,使用友元函数来实现所有的重载操作符号。
2、复数由两个部分组成:实数部分和虚数部分。
复数的一种书写方式是:(3.0, 4.0),其中,
3.0是实数部分,
4.0是虚数部分。
假设a=(A,Bi),c=(C,Di),则下面是一些复
数运算:
A、加法:a+c = (A + C,(B+D)i)
B、减法:a-c = (A - C,(B-D)i)
C、乘法:a*c = (A *C – B*D,(A*D + B*C)i)
D、乘法:x * c=( x*C, x*Di), 其中x 为实数
E、共轭:~a = (A, -Bi)
请定义一个复数类,以便下面的程序可以使用它来获得正确的结果:
#include <iostream>
Using namespace std;
#include “complex0.h”
Int main()
{
Complex a(3.0, 4.0); // 初始化一个复数
Complex c;
Cout << “Enter a Complex number (q to quit): \n”;
While (cin >> c)
{
Cout << “ c is ” << c<< ‘\n’;
Cout << “C omplex conjugate is” << -c << ‘\n’;
Cout << “a is” << a<< ‘\n’;
Cout << “a + c is” << a + c<< ‘\n’;
Cout << “a - c is” << a - c<< ‘\n’;
Cout << “a * c is” << a * c<< ‘\n’;
Cout << “2 * c is” << 2 * c<< ‘\n’;
Cout << “Enter a Complex number (q to quit): \n”;
}
Cout << “Done!” << endl;
Return 0;
}
注意,必须重载<< 和>> 操作符。
在定义的过程中应近可能的使用const.
下面是该程序的运行情况:
Enter a Complex number (q to quit):
Real : 10
Imaginary: 12
C is (10,21i)
Complex conjugate is ( 10, -12i)
a is ( 3, 4i)
a + c is (13, 16i)
a - c is (-7, -8i)
a * c is (-18,76i)
2 * c is(20,24i)
Enter a Complex number (q to quit):
Real:q
Done!
请注意,经过重载后,cin >> c 应该提示用户输入实数和虚数部分
3、定义一个名为MyInteger的类,用于存储整数。
类中应该包含用来获取和设置整数的值
的函数。
然后,重载“[]”操作符,使索引返回位置i处的位数,其中i=0是最低有效位。
如果不存在这样的数位,则返回-1.
例如:如果x是MyInteger类的对象并被设置为418,则x[0]应该返回8,x[1]应该返回1,x[2]应该返回4,而x[3]应该返回-1
4、在古代,美丽公主Eve有许多求婚者。
她决定用如下的方式来挑选她的新郎。
首先,
所有求婚者一个接一个的排成一行并按顺序编号。
第一个求婚者为1号,第二个求婚者为2号,如此类推知道最后一个求婚者为n号。
Eve从第一个求婚者开始顺序数三个人(因为她的名字有三个字母),然后剥夺第三个求婚者的机会,将其排除出队伍。
接着Eve再数三个求婚者,并也将当中的第三个排除。
当数到行末时,她将继续从头数起。
例如,如果有6个求婚者,则挑选过程将如下:
123456 最初的求婚者队伍,从1开始数起
12456 求婚者3被排除,继续从4数起
1245 求婚者6被排除,继续从1数起
125 求婚者4被排除,继续从5数起
15 求婚者2被排除,继续从5数起
1 求婚者5被排除,求婚者1是最终的幸运儿
若有n个求婚者,编写一个程序,使用向量来判断你该站在哪里才能最终与公主结婚。
你会发现线面这个赖在Vector类的函数很有有:
v.erase(iter);
//删除位置iter上的元素
例如,要用这个函数在名为theVector的向量变量中从头开始删除第4个元素,可以使用一下语句:
theVector.erase(theVector.begin()+3);
4、使用数字3是因为在向量中第一个元素位于索引位置0.。