第3讲 运算符重载

合集下载

C++基础系列——运算符重载

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运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。

第3章 运算符重载

第3章 运算符重载
11
3.2 重载成员函数-实例-3/3
void complex::display() { cout<<"("<<m_real<<","<<m_imag<<")"<<endl; } void main() //主函数 { complex c1(5,4),c2(2,10),c3; //声明复数类的对象 cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3=c1-c2; //使用重载运算符完成复数减法 程序输出的结果为: cout<<"c3=c1-c2="; c1=(5,4) c3.display(); c2=(2,10) c3=c1+c2; //使用重载运算符完成复数加法 c3=c1-c2=(3,-6) cout<<"c3=c1+c2="; c3.display(); c3=c1+c2=(7,14) }
运算符 双目运 算符@ 前置单目@ @ oprd 后置单目@ oprd @ operator @(oprd ) operator @(oprd,0 ) 使用形式 oprd1 @ oprd2 等价式 operator @(oprd1,oprd2 )
15
3.3 重载友元函数-使用
• 如果一个运算符想用某个基本类型的数据调用,它就必须
10
3.2 重载成员函数-实例-2/3
const complex complex::operator +(complex c2) //重载函数实现 { complex c; 如何创建的? c.m_real = c2.m_real+m_real; c.m_imag = c2.m_imag+m_imag; 这是个什么式子? 做了件什么事? return complex(c.m_real,c.m_imag); 是否可以简化? } const complex complex::operator -(complex c2) //重载函数实现 { complex c; c.m_real = m_real-c2.m_real; c.m_imag = m_imag-c2.m_imag; return c; }

简述运算符重载的规则

简述运算符重载的规则

简述运算符重载的规则
运算符重载可以用来定义自定义类型的操作行为。

以下是运算符重载的规则:
1. 运算符重载函数必须是类或枚举类型的成员函数或全局函数。

2. 运算符重载函数的名称必须是“operator”加上要重载的运算符符号,例如“operator +”或“operator <<”。

3. 运算符重载函数必须指定参数列表,包括参数类型和数量,不能有默认值。

4. 运算符重载函数可以返回任何类型,但不能返回void 类型。

5. 运算符重载函数可以是const 成员函数,如果不会修改对象的状态。

6. 运算符重载函数可以被重载多次,只要参数列表不同。

7. 运算符重载函数不能改变运算符的优先级和结合性,也不能改变运算符的语法。

8. 运算符重载应该符合语义上的期望,例如“+”操作符应该执行加法,而不是减法。

9. 运算符重载应该遵循刚才提到的运算符的语法和行为。

总之,运算符重载在正确地使用时,可以使代码更加直观,易于理解,也可以让自定义数据类型具有更多的功能和操作。

运算符重载

运算符重载

1、多态性的基本概念2、派生类对象替换基类对象3、虚函数的定义4、抽象类的定义5、宠物类的设计6、运算符重载7、日期类对象判断大小8、分数类对象运算符重载☐运算符重载指赋予运算符新的操作功能,主要用于对类的对象的操作☐运算符+意味着多少对象类型的加法呢?☐还可以定义新的对象类型加法☐运算符重载定义形式:<类型><类名>::operator<操作符>(<参数表>){函数体}☐首先定义虚数类☐虚数可以描述为:a+bi☐a与b看成实数,定义成double类型☐成员函数除了构造与析构外,还有:☐输出虚数、修改虚数、得到实部a、得到虚部b ☐相加+、判相等==#include <iostream>using namespace std;class Complex{private:double real, imag;public:Complex(double r = 0, double i = 0): real(r), imag(i){ }double Real(){return real;}double Imag(){return imag;}Complex operator +(Complex&);Complex operator +(double);bool operator ==(Complex);~Complex(){ };Complex Complex::operator +(Complex &c)// 重载运算符+,两边是虚数对象{Complex temp;temp.real = real+c.real;temp.imag = imag+c.imag;return temp;}Complex Complex::operator +(double d)// 重载运算符+,左边是虚数对象,右边是双精度数{Complex temp;temp.real = real+d;temp.imag=imag;return temp;}bool Complex::operator ==(Complex c)// 重载运算符=={if (real == c.real && imag == c.imag)return true;elseint main(){Complex c1(3,4),c2(5,6),c3;cout << "C1 = " << c1.Real() << "+j" << c1.Imag() << endl;cout << "C2 = " << c2.Real() << "+j" << c2.Imag() << endl;c3 = c1+c2;cout << "C3 = " << c3.Real() << "+j" << c3.Imag() << endl;c3 = c3+6.5;cout << "C3 + 6.5 = " << c3.Real() << "+j" << c3.Imag() << endl;if ( c1==c2 )cout<<“两个复数相等”;elsecout<<“两个复数不相等”;return 0;☐运算符++分前置运算符和后置运算符☐例如: ++Y与Y++☐前置运算符定义Complex Complex::operator ++ () {real+=1;return *this;}☐后置运算符定义Complex Complex::operator ++ (int) {real+=1;return *this;}。

c++结构体重载运算符

c++结构体重载运算符

c++结构体重载运算符C++结构体可以通过重载运算符来实现自定义的操作符行为。

重载运算符允许我们使用结构体对象与其他对象之间进行类似于内置数据类型的操作。

下面将介绍一些常用的运算符重载的方式以及其使用场景。

1. 算术运算符重载:- 重载+运算符:可以用于结构体对象之间的相加操作。

- 重载-运算符:可以用于结构体对象之间的相减操作。

- 重载*运算符:可以用于结构体对象与标量之间的乘法运算。

- 重载/运算符:可以用于结构体对象与标量之间的除法运算。

2. 关系运算符重载:- 重载==运算符:用于比较两个结构体对象是否相等。

- 重载!=运算符:用于比较两个结构体对象是否不相等。

- 重载<运算符:用于比较两个结构体对象的大小关系。

- 重载>运算符:用于比较两个结构体对象的大小关系。

- 重载<=运算符:用于比较两个结构体对象的大小关系。

- 重载>=运算符:用于比较两个结构体对象的大小关系。

3. 赋值运算符重载:- 重载=运算符:用于将一个结构体对象的值赋给另一个对象。

- 重载+=运算符:用于将一个结构体对象与另一个对象相加,并将结果赋给第一个对象。

- 重载-=运算符:用于将一个结构体对象与另一个对象相减,并将结果赋给第一个对象。

- 重载*=运算符:用于将一个结构体对象与标量相乘,并将结果赋给第一个对象。

- 重载/=运算符:用于将一个结构体对象与标量相除,并将结果赋给第一个对象。

4. 输入输出运算符重载:- 重载<<运算符:用于将结构体对象的数据输出到标准输出流。

- 重载>>运算符:用于从标准输入流中读取数据,并赋给结构体对象的成员变量。

运算符重载的基本语法如下:```返回类型 operator运算符(参数列表) {// 重载运算符的实现代码// 可以直接访问结构体对象的成员变量// 可以调用结构体对象的方法// 可以与其他对象进行运算// 返回运算结果}```在进行运算符重载时,需要注意以下几点:- 重载运算符必须是成员函数或友元函数。

operator运算符重载

operator运算符重载

8.4 运算符重载运算符重载是非常重要的功能,因为它使我们能够使用像+、–、*这样的标准C++运算符,来处理自定义数据类型的对象。

该功能允许我们编写重新定义特定运算符的函数,从而使该运算符处理类对象时执行特定的动作。

例如,我们可以重新定义>运算符,从而使该运算符用于前面看到的CBox类对象时,如果第一个实参的体积比第二个大,就返回true。

运算符重载功能不允许我们使用新的运算符,也不允许我们改变运算符的优先级,因此运算符的重载版本在计算表达式的值时优先级与原来的基本运算符相同。

运算符的优先级表可以在本书第2章和MSDN库中找到。

虽然我们不能重载所有运算符,但限制不是特别严格。

下面给出不能重载的运算符:作用域解析运算符::条件运算符?:直接成员访问运算符.sizeof运算符sizeof解除对指向类成员的指针的引用运算符.*任何其他运算符都是可以重载的,这给予我们相当大的灵活性。

显然,确保标准运算符的重载版本与原来的正常用途一致,或者至少在操作上相当直观,是合适的想法。

如果为某个类重载的+运算符却执行使类对象相乘的操作,这可能就不是明智的做法。

理解运算符重载机制如何工作的最好方法是完成一个示例,因此下面为CBox类实现刚才提到的大于运算符>。

8.4.1 实现重载的运算符为了给某个类实现重载的运算符,我们必须编写特殊的函数。

假设在类定义内重载>运算符的函数是CBox类的成员,则该函数的声明如下所示:class CBox{public:bool operator>(CBox& aBox) const; // Overloaded 'greater than'// Rest of the class definition...};这里的单词operator是个关键字。

该关键字结合运算符符号或名称,本例中是>,将定义一个运算符函数。

本例中的函数名是operator>()。

运算符重载

运算符重载
CCS E
24
运算符重载
思考:如果希望表达式i+c1有意义, 思考:如果希望表达式i+c1有意义,应该 i+c1有意义 如何定义重载运算符函数? 如何定义重载运算符函数?
friend Complex operator+(int &i,Complex &c); Complex operator+(int &i, Complex &c) {return Complex(i+c.real,c.imag);}
2
什么是运算符重载
代码分析: 代码分析: 例10.1 通过函数来实现复数 相加。 相加。
CCS E
3
运算符重载的方法
运算符重载的方法是定义一个重载运 算符的函数, 算符的函数,在需要执行被重载的运 算符时,系统就自动调用该函数, 算符时,系统就自动调用该函数,以 实现相应的运算。也就是说, 实现相应的运算。也就是说,运算符 重载是通过定义函数实现的。 重载是通过定义函数实现的。运算符 重载实质上是函数的重载。 重载实质上是函数的重载。
CCS E
21
运算符重载
如果将运算符重载函数作为成员函数, 如果将运算符重载函数作为成员函数, 它可以通过this this指针自由地访问本类 它可以通过this指针自由地访问本类 的数据成员, 的数据成员,因此可以少写一个函数 的参数。 的参数。但必须要求运算表达式第一 个参数(即运算符左侧的操作数) 个参数(即运算符左侧的操作数)是一 个类对象, 个类对象,而且与运算符函数的类型 相同。 相同。因为必须通过类的对象去调用 该类的成员函数,而且只有运算符重 该类的成员函数, 载函数返回值与该对象同类型, 载函数返回值与该对象同类型,运算 结果才有意义。 结果才有意义。

简述运算符重载的规则。

简述运算符重载的规则。

简述运算符重载的规则。

篇一:运算符重载是C/C++语言中一种强大的功能,允许程序员自定义函数的行为,以处理不同类型的数据。

运算符重载允许程序员在函数中重载算术、逻辑和位运算符,从而能够处理数组、结构体和指针等不同类型的数据。

以下是运算符重载的规则:1. 算术运算符重载算术运算符包括加号、减号、乘号和除号。

每个算术运算符都有一组默认的行为,可以通过运算符重载来自定义它们的行为。

例如,重载加号运算符可以使函数接受一个整数参数,并返回一个新的整数。

下面是一个简单的例子,演示了如何重载加号运算符:```c++struct MyStruct {int value;};MyStruct operator+(const MyStruct& other, int value) {return MyStruct(value + other.value);}int main() {MyStruct mystruct1 = { 10 };MyStruct mystruct2 = { 20 };int result = mystruct1 + mystruct2;std::cout << "result = " << result << std::endl;return 0;}```在上面的例子中,我们定义了一个名为`MyStruct`的结构体类型,其中包含一个整数类型。

然后,我们定义了一个重载加号运算符的函数,该函数接受一个整数类型的参数,并返回一个新的`MyStruct`对象。

在`main`函数中,我们定义了两个`MyStruct`对象`mystruct1`和`mystruct2`,并将它们相加,结果存储在`result`变量中。

2. 逻辑运算符重载逻辑运算符包括条件运算符和逻辑非运算符。

每个逻辑运算符都有一组默认的行为,可以通过运算符重载来自定义它们的行为。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3讲 运算符重载(教材第4章)
●C++ 预定义的运算符只能对基本类型的数据进 行操作,不能用于自定义数据类型的运算。 ●对于用户自定义的数据类型往往需要有类似的
运算操作,客观上需要定义适用用户自定义数据类
型的有关运算。
这就是运算符重载问题
class complex //复数类声明 { public: complex(double r=0.0,double i=0.0) //构造函数 { real=r; imag=i; } void display(); //显示复数的值 private: double real; double imag; };
13
程序输出的结果为:
c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14)
14

前置单目运算符 U
(1) 如果要重载 U 为类成员函数,使之能够实现表
达式 U oprd, 其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数,无形参。
(2) 经重载后,

可以重载C++中除下列运算符外的所有运算符: . .* :: ?:


只能重载C++语言中已有的运算符,不可臆造新的。
不改变原运算符的优先级和结合性。 不能改变操作数个数。

经重载的运算符,其操作数中至少应该有一个是自定 义类型。

重载为类成员函数。

重载为非成员函数(通常为友元函数)。

21
程序运行结果为:
First time output: 23:59:59 Show myClock++: 23:59:59 Show ++myClock: 0:0:1
22

如果需要重载一个运算符,使之能够用于操作某类 对象的私有成员,可以此将运算符重载为该类的非 成员(通常为友元)函数。 函数的形参代表依自左至右次序排列的各操作数。 后置单目运算符 ++和--的重载函数,形参列表中 要增加一个int,但不必写形参名。
10
complex complex::operator +(complex c2) //重载函数实现 { complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); // return c; }
+运算符 -运算符
complex::complex(double r,double i) { real=r; imag=i; } complex complex::operator +(const complex& c) { double r=real+c.real; double i=imag+c.imag; return complex(r,i); } complex complex::operator -(const complex& c) { double r=real-c.real; double i=imag-c.imag; return complex(r,i); }
11
complex complex::operator -(complex c2) //重载函数实现 { complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); // return c;
//运算符重载友元函数实现
{ return complex(c2.real+c1.real, c2.imag+c1.imag); } complex operator -(complex c1,complex c2)
//运算符重载友元函数实现
{ return complex(c1.real-c2.real, c1.imag-c2.imag); } // 其他函数和主函数同例4-1
}
20
//其它成员函数的实现略 int main() { Clock myClock(23,59,59); cout<<"First time output:"; myClock.ShowTime(); cout<<"Show myClock++:"; (myClock++).ShowTime(); cout<<"Show ++myClock:"; (++myClock).ShowTime(); }

用“+”、“-”能够实现复数的加减运算吗? 实现复数加减运算的方法
——重载“+”、“-”运算符

运算符重载是对已有的运算符赋予多重含义 必要性 C++中预定义的运算符其运算对象只能是基本 数据类型,而不适用于用户自定义类型(如类)


实现机制 (1)将指定的运算表达式转化为对运算符函数的 调用,运算对象转化为运算符函数的实参。 (2)编译系统对重载运算符的选择,遵循函数重载 的选择原则。
oprd1 B oprd2,
其中 oprd1 为A 类对象,则 B 应被重载为 A 类的成员函数 ,形参类型应该是 oprd2 所属的类型。 (2)经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)
将“+”、“-”运算重载为复数类的成员函数。

规则:



双目运算符 B重载后, 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, 表达式 B oprd 等同于operator B(oprd ) 后置单目运算符 ++和--重载后, 表达式 oprd B 等同于operator B(oprd,0 )
表达式 U oprd 相当于 oprd.operator U()

后置单目运算符 ++和—
如果要重载 ++或--为类成员函数,使之能够实现表 达式 oprd++ 或 oprd-- ,
其中 oprd 为A类对象,则 ++或-- 应被重载为 A 类 的成员函数,且具有一个 int 类型形参。 经重载后,表达式 oprd++ 相当于
不能改变运算符操作数的个数; 不能改变运算符原有的优先级; 不能改变运算符原有的结合性; 不能改变运算符原有的语法结构;
例:分析下列程序的输出结果。
#include <iostream.h> class complex { public: complex(double r=0,double i=0); complex operator +(const complex& c); complex operator -(const complex& c); complex operator -(); 求负运算符 void print() const; private: double real,imag; };
27
1、哪些运算符可以重载?
算术运算符:+、-、*、/、%、++、--; 位操作运算符:&、|、~、^、<<、>>; 逻辑运算符:!、&&、||; 比较运算符:>、<、>=、<=、==、!=; 赋值运算符:=、+=、-=、*=、/=、%=、 &=、|=、~=、<<=、>>=; 其他运算符:[]、()、->、' 、new、delete、 new[]、delete[]、->*;

不允许重载的运算符:.、.*、::、?:、sizeof;
2、编译程序如何选用哪一个运算符函数?
运算符实质上是函数,遵循函数重载原则; 3、运算符重载时必须遵循哪些原则?

重载运算符含义必须清楚; 重载运算符不能有二义性;
4、重载运算符有哪些限制?

不可臆造新的运算符; 重载运算符坚持4个“不能改变”:
声明形式: 函数类型 operator 运算符(形参) { ...... } 重载为类成员函数时: 参数个数=原操作数个数-1

(后置++、--除外)

重载为友元函数时 : 参数个数=原操作数个数,且至少应该有一个自定义 类型的形参。
主要讨论:双目运算和单目运算

双目运算符 B
(1)如果要重载 B 为类成员函数,使之能够实现表达式
}
12
void complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; } int main() //主函数 { complex c1(5,4),c2(2,10),c3; //声明复数类的对象 cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3=c1-c2; //使用重载运算符完成复数减法 cout<<"c3=c1-c2="; c3.display(); c3=c1+c2; //使用重载运算符完成复数加法 cout<<"c3=c1+c2="; c3.display(); }
相关文档
最新文档