编程题6_2_运算符重载
复习五 运算符重载(改)

6.1 运算符重载的规则
算符重载就是赋予已有的运算符多重含义 运算符重载就是赋予已有的运算符多重含义。 例如: 例如:a=3+4; ; a=”abc”+”def”; 同一个运算符“+”,由于所操作的数据类型不 同一个运算符“ 同而具有不同的意义,这就是运算符重载。 同而具有不同的意义,这就是运算符重载。 运算符重载是C++的一项强大功能。通过重载, 运算符重载是 的一项强大功能。通过重载, 的一项强大功能 可以扩展C++运算符的功能,使它们能够操作用户 运算符的功能, 可以扩展 运算符的功能 自定义的数据类型, 自定义的数据类型,增加程序代码的直观性和可读 性
5
void main(void){ Complex c1(1,2),c2(3,4),c3,c4,; c3=c1+c2; c4=c1-c2; } c1+c2被解释为:operator+(c1,c2) 被解释为: 被解释为 c1-c2被解释为: operator-(c1,c2) 被解释为: 被解释为
6
cout<<r;
if (i>0) cout<<"+"; If (i!=0) cout<<i<<"i"<<endl; }
void main(void) { Complex c1(1,2),c2(3,4),c3,c4,; c3=c1+c2; C++会将它们转换成下面形式的调用 会将它们转换成下面形式的调用 c4=c1-c2; 语句: 语句: c1.display(); // 1+2i c3=c1.operator+(c2); c2.display(); // 3+4i c4=c1.operator –(c2); c3.display(); // 4+6i c4.display();} // -2-2i
编程技术中的运算符重载和函数重载

编程技术中的运算符重载和函数重载编程技术中的运算符重载和函数重载是两个非常重要的概念。
它们可以让程序员更加灵活地使用已有的运算符和函数,从而提高编程效率和代码可读性。
本文将分别介绍运算符重载和函数重载的概念、用法和应用场景。
一、运算符重载运算符是编程语言中的一种特殊符号,用于表示不同的数学和逻辑运算。
在传统的编程语言中,每个运算符都有固定的语义和操作对象。
但是,在某些情况下,我们可能希望对已有的运算符进行自定义的操作。
这就是运算符重载的概念。
运算符重载可以让程序员重新定义运算符的操作行为。
通过重载运算符,我们可以使得运算符对用户自定义的类型也能够进行操作。
例如,我们可以定义一个名为"Vector"的类,然后重载"+"运算符,使得两个"Vector"对象可以相加。
这样,我们就可以像操作普通的整数或浮点数一样,对"Vector"对象进行加法运算。
运算符重载的语法和用法因编程语言而异。
在C++中,运算符重载通过定义特殊的成员函数来实现。
例如,重载"+"运算符的成员函数的定义如下:```cppclass Vector {public:Vector operator+(const Vector& other) {Vector result;// 实现向量相加的逻辑return result;}};```通过重载运算符,我们可以使得代码更加简洁和易读。
例如,我们可以使用如下方式对两个"Vector"对象进行相加:```cppVector v1, v2;Vector sum = v1 + v2;```二、函数重载函数重载是指在同一个作用域中,可以定义多个同名函数,但是这些函数的参数列表必须不同。
函数重载可以让程序员使用相同的函数名来实现不同的功能,从而提高代码的可读性和复用性。
函数重载的用法非常灵活。
C++基础系列——运算符重载

C++基础系列——运算符重载1. 运算符重载简介所谓重载,就是赋予新的含义。
函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。
同样运算符重载(Operator Overloading)可以让同⼀个运算符可以有不同的功能。
可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据也可以⾃定义运算符重载:class Complex{public:Complex();Complex(double real, double imag);Complex operator+(const Complex &a) const;void display() const;private:double m_real;double m_imag;};// ...// 实现运算符重载Complex Complex::operator+(const Complex &A) const{Complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this -> m_imag + A.m_imag;return B;// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);}int main(){Complex c1(4.3, 5.8);Complex c2(2.7, 3.7);Complex c3;c3 = c1 + c2; // 运算符重载c3.display();return 0;}运算结果7 + 9.5i运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。
运算符重载

// 顺序错误
.
27
由于使用友元会破坏类的封装,要尽量将运算 符重载函数定义为成员函数。
除非有特殊需要,才使用友元函数重载运算符。
.
28
4.5重载双目运算符
双目的意思是运算符左边和右边的操作数均参 加运算。
如果要重载 B 为类的成员函数,使之能够实 现表达式 oprd1 B oprd2,其中 oprd1 为A 类 对象,则 B 应被重载为 A 类的成员函数,形 参类型应该是 oprd2 所属的类型。
.
24
加法运算符重载为友元函数,C++ 在编译时将表达式 c1+c2解释为
operator + ( c1, c2) 即相当于执行以下函数
Complex operator + ( Complex & c1, Complex & c2 ) {
return Complex( c1.real + c2.real , c1.imag + c2.imag ) ; }
.
3
运算符重载的实质
运算符重载是对已有的运算符赋予多重含义。
必要性:C++中预定义的运算符其运算对象只 能是基本数据类型,而不适用于用户自定义类 型(如类)
实现机制
将指定的运算表达式转化为对运算符函数的调用, 运算对象转化为运算符函数的实参。
编译系统对重载运算符的选择,遵循函数重载的选 择原则。
friend Complex operator + ( int & i , Complex & c )
{
return Complex( c.real + i , c.imag ) ;
运算符重载

void complex::print( ) { if (imag==0) cout<<real<<endl; else if(imag>0) cout<<real<<"+"<<imag<<"i\n"; else cout<<real<<imag<<"i\n"; } complex operator -(complex obj) { complex temp; temp. real= -obj.real ; temp. imag= -obj.imag; return temp; }
10
void main( ) { complex com1(2.3,4.6),com2(3.6,2.8),result; cout<<"complex com1 and com2 orderly:\n"; com1.print( ); com2.print( ); result=com1+com2; cout<<"com1+com2="; result.print( ); result=com1-com2; cout<<"com1-com2="; result.print( ); result=com1*com2; cout<<"com1*com2="; result.print( ); result=com1/com2; cout<<"com1/com2="; result.print( ); }
2、双目运算符的重载
国家二级C++机试(运算符重载、模板和C++流)模拟试卷6

国家二级C++机试(运算符重载、模板和C++流)模拟试卷6(总分:58.00,做题时间:90分钟)一、选择题(总题数:29,分数:58.00)1.若在表达式y/x中,''/''是作为成员函数重载的运算符,则该表达式还可以表示为( )。
(分数:2.00)A.x.operator/(y)B.operator/(x,y)C.y.operator/(x) √D.operator/(y,x)解析:解析:运算符函数的函数名是由运算符前加关键字operator构成的。
所以当“/”作为运算符重载后,其格式为operator/。
所以其作为成员函数调用时的格式为y.operator/(x)。
2.有类定义如下: class Type{ public: Type(int i=0); Type operator-(int); friend Type operator+(Type,Type); private: int val; };若有对象定义Type c1;则下列语句序列中,错误的是( )。
(分数:2.00)A.Type(3)+c1;B.e1+Type(3);C.3-c1:√D.c1-3;解析:解析:由于在类Type中对“-”进行了重载,所以根据“-”重载的形式定义,c1-3是正确的,而3-c1是错误的表达式。
3.若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )。
(分数:2.00)A.Data+(Data);B.Data operator+{Data};√C.Data+operator{Data};D.operator+(Data,Data);解析:解析:“+”是一个二元运算符,因此作为成员函数重载时参数表中只有一个参数,对应于第二个操作数,而第一个操作数是对象本身。
运算符函数的函数名是由运算符前加关键字operator构成的。
4.若要对类BigNumber中重载的类型转换运算符long进行声明,下列选项中正确的是( )。
9.6.2 运算符重载[共11页]
![9.6.2 运算符重载[共11页]](https://img.taocdn.com/s3/m/6d98a6f80066f5335b812112.png)
答案 C
面试例题 34:重载和覆写有什么区别?
考点:重载和覆写之间区别的理解。 出现频率:★★★★ 解析 重载(overriding)是指子类改写父类的方法;覆写(overloading)是指同一个函数的不同 版本之间参数不同。 重载是编写一个与已有函数同名但是参数表不同(参数数量或参数类型不同)的方法,它 具有如下所示的特征。 方法名必须相同。 参数列表必须不相同,与参数列表的顺序无关。 返回值类型可以不相同。 覆写是派生类重写基类的虚函数,它具有如下所示的特征。 只有虚方法和抽象方法才能够被覆写。 具有相同的函数名。 具有相同的参数列表。 具有相同的返回值类型。 重载是一种语法规则,由编译器在编译阶段完成,不属于面向对象的编程;而覆写是由运 行阶段决定的,是面向对象编程的重要特征。
面试例题 35:编程题—MyString 类的编写。
考点:重载=和+运算符。
出现频率:★★★
对于下面的类 MyString,要求重载运算符后可以计算表达式 a=b+c(a、b、c 都是类 MyString
的对象)。请重载相应的运算符并编写程序测试。
1 class MyString
2{
3 public:
218 第 9 章 C++面向对象
在少数情况下重载 new、delete 运算符。 运算符重载需要遵循以下所示的规则; 重载的运算符不能违反语言的语法规则。 如果一个运算符可以放在两个操作数之间,就可以重载它来满足类操作的需要,哪怕
这种用法原本为编译器所不能接受。 不能创造 C++语言中没有的运算符。 重载时不能改变运算符的优先级。
个是“=”运算符,用于对象 a 的赋值。程序代码如下:
6运算符重载

6.1.2 运算符重载的语法形式
➢ 运算符通常是对类中的私有成员进行操作,故重载运算符应 能访问类中的私有成员,所以重载运算符一般采用成员函数或 友员函数的形式。 ➢ 成员函数的语法形式为:
类型 类名 :: operator op ( 参数表 )
{
// 相对于该类定义的操作
else
{ cout << "\n Data overflow !" << endl ;
Hale Waihona Puke #include<iostream.h> #include<stdlib.h> class Calculator { public:
Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main()
第6章 运算符重载
运算符重载使得用户自定义的数据以一种更简洁的方式工作,
就是赋予已有的运算符多重含义。
能表示为
例如
? c1 = c1 + c2 ;
int x , y ; y=x+y;
complex c1 , c2 ; c1 = Cadd (c1 , c2 ) ;
定能义表示为
? // 运复m算数1类符=对重m象载1 +函m数2 ;
{
// 相对于该类定义的操作
} ➢ 一个运算符被重载后,原有意义没有失去,只是定义了相对 一特定类的一个新运算符
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cin>>row_b>>col_b;
Matrix bm(row_b,col_b),cm;
cout<<"am:"<<endl;
am.disp();
cout<<"bm:"<<endl;
bm.disp();
cm=am+bm;
cout<<"cm=am+bm:"<<endl;
exit(0);
}
else
for(int i=0;i<mat1.row;i++)
for(int j=0;j<mat1.col;j++)
(*(mat1.m+i*mat1.col+j))+=(*(mat2.m+i*mat2.col+j));
return mat1;
}
Matrix & Matrix::operator=(Matrix &mat)
123
456
789
bm:
987
654
321
cm=am+bm:
101010
101010
101010
am=bm:
987
654
321
第二个测试用例:
输入部分:
34<回车>
1 2 3 4 5 6 7 8 910 11 12
33<回车>
9 8 7 6 5 4 3 2 1
输出部分:
请输入am矩阵的行数和列数:请输入该矩阵元素:请输入bm矩阵的行数和列数:请输入该矩阵元素:am:
cm.disp();
am=bm;
cout<<"am=bm:"<<endl;
am.disp();
return 0;
}
(7)类的成员函数disp的代码如下:
void Matrix::disp()
{
for(int i=0;i<row;i++)
{
cout<<'\t';
for(int j=0;j<col;j++)
}
void Matrix::disp()
{
for(int i=0;i<row;i++)
{
cout<<'\t';
for(int j=0;j<col;j++)
cout<<*(m+i*col+j)<<'\t';
cout<<endl;
}
}
int main()
{
int row_a,col_a,row_b,col_b;
cout<<"bm:"<<endl;
bm.disp();
cm=am+bm;
cout<<"cm=am+bm:"<<endl;
cm.disp();
am=bm;
cout<<"am=bm:"<<endl;
am.disp();
return 0;
}
参考源代码仅供老师参考,不要添加到系统中
★说明:
(1)请各位按上表格式,第一列不变,第二三列为各位根据题目填写
(2)要求分别输入矩阵am和bm的行列数,各矩阵元素,分别计算cm=am+bm;am=bm;并进行输出
(3)定义相应的构造函数和析构函数
(4)类中的成员变量应当有三个:int row,col;分别表示矩阵的行数和列数,另外还需要定义一个一级指针m用来申请动态空间,存放row*col个整数
(5)程序最前面的文件包含提交到系统中请用下面代码:
cout<<"请输入am矩阵的行数和列数:";
cin>>row_a>>col_a;
பைடு நூலகம்Matrix am(row_a,col_a);
cout<<"请输入bm矩阵的行数和列数:";
cin>>row_b>>col_b;
Matrix bm(row_b,col_b),cm;
cout<<"am:"<<endl;
am.disp();
{
delete m;
m=new int[mat.row*mat.col];
row=mat.row;
col=mat.col;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
*(m+i*col+j)=*(mat.m+i*mat.col+j);
return *this;
即本地调试运行正确无误后,再将头文件部分改掉提交!
(6)请根据提供的主函数,给出相应的类定义和函数定义。
int main()
{
int row_a,col_a,row_b,col_b;
cout<<"请输入am矩阵的行数和列数:";
cin>>row_a>>col_a;
Matrix am(row_a,col_a);
cin>>m[i*col+j];
}
Matrix::~Matrix()
{
delete m;
}
Matrix &operator+(Matrix &mat1,Matrix &mat2)
{
if(mat1.col!=mat2.col||mat1.row!=mat2.row)
{
cout<<"program terminated!"<<endl;
class Matrix
{
int *m,row,col;
public:
Matrix(int ,int);
Matrix();
~Matrix();
friend Matrix &operator+(Matrix &,Matrix &);
Matrix & operator=(Matrix &);
void disp();
名称
编程题6_2:矩阵类中的运算符重载
备注
描述
设计一个矩阵类,要求矩阵类中重载运算符加(+)和赋值(=),主函数定义类对象并调用重载的运算符。
提示:(1)本题考虑可加(即加与被加矩阵的行列数必须分别相等)和可赋值(等号左值和右值的行列数必须分别相等)情况,其他情况输出“ program terminated! ”
cout<<*(m+i*col+j)<<'\t';
cout<<endl;
}
}
在保存并预览之后,点开:“测试用例”选项卡,再选择下方的“添加”,加入两组测试用例
第一个测试用例:
输入部分:
33<回车>
1 2 3 4 5 6 7 8 9
3 3<回车>
9 8 7 6 5 4 3 2 1
输出部分:
请输入am矩阵的行数和列数:请输入该矩阵元素:请输入bm矩阵的行数和列数:请输入该矩阵元素:am:
};
Matrix::Matrix()
{
row=col=0;
m=NULL;
}
Matrix::Matrix(int r,int c)
{
row=r;col=c;
m=new int[row*col];
cout<<"请输入该矩阵元素:";
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
1234
5678
9101112
bm:
987
654
321
program terminated!
参考源程序代码
#include <iostream>//说明:在VC++下请将此句改为#include <iostream.h>
using namespace std;//说明:在VC++下请将此句注释
#include <stdlib.h>
(2)允许的编程语言:选gc++,
(3)名称和描述两项请将文档第二列内容对应贴入系统中
(4)测试用例请各位自己添加,题目的最后已有描述,每个题目也说明了要给几组测试用例
(5)其他选项可以自行设定,例如开启时间,结束时间,等等,需要大家逐步熟悉
#include <iostream>
using namespace std;
#include <stdlib.h>
但是在VC++环境下本地测试时,如果你的程序中用到了友元,则要将头文件用下面的代码(提交时再修改为上面的三行):
#include <iostream.h>
#include <stdlib.h>