C++ 运算符重载 各类详细介绍

合集下载

C++operator关键字(重载操作符)

C++operator关键字(重载操作符)

C++operator关键字(重载操作符)operator是C++的关键字,它和运算符⼀起使⽤,表⽰⼀个运算符函数,理解时应将operator=整体上视为⼀个函数名。

这是C++扩展运算符功能的⽅法,虽然样⼦古怪,但也可以理解:⼀⽅⾯要使运算符的使⽤⽅法与其原来⼀致,另⼀⽅⾯扩展其功能只能通过函数的⽅式(c++中,“功能”都是由函数实现的)。

⼀、为什么使⽤操作符重载?对于系统的所有操作符,⼀般情况下,只⽀持基本数据类型和标准库中提供的class,对于⽤户⾃⼰定义的class,如果想⽀持基本操作,⽐如⽐较⼤⼩,判断是否相等,等等,则需要⽤户⾃⼰来定义关于这个操作符的具体实现。

⽐如,判断两个⼈是否⼀样⼤,我们默认的规则是按照其年龄来⽐较,所以,在设计person 这个class的时候,我们需要考虑操作符==,⽽且,根据刚才的分析,⽐较的依据应该是age。

那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了⽤户定义的数据类型class,所以,需要⽤户⾃⼰来提供该参数版本的实现。

⼆、如何声明⼀个重载的操作符?A: 操作符重载实现为类成员函数重载的操作符在类体中被声明,声明⽅式如同普通成员函数⼀样,只不过他的名字包含关键字operator,以及紧跟其后的⼀个c++预定义的操作符。

可以⽤如下的⽅式来声明⼀个预定义的==操作符:class person{private:int age;public:person(int a){this->age=a;}inline bool operator == (const person &ps) const;};实现⽅式如下:inline bool person::operator==(const person &ps) const{if (this->age==ps.age)return true;return false;}调⽤⽅式如下:#includeusing namespace std;int main(){person p1(10);person p2(20);if(p1==p2) cout<<”the age is equal!”< return 0;}这⾥,因为operator ==是class person的⼀个成员函数,所以对象p1,p2都可以调⽤该函数,上⾯的if语句中,相当于p1调⽤函数==,把p2作为该函数的⼀个参数传递给该函数,从⽽实现了两个对象的⽐较。

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

运算符重载

运算符重载

// 顺序错误
.
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 ) ;

c++学习资料第 06 章 运算符重载

c++学习资料第 06 章 运算符重载
第 4 页 共 15 页 (西昌学院信息技术系 韩德)
第 6 章 运 算 符 重 载
{ return Complex( ­c.Real, ­c.Image ); } void Complex::print()const { cout << '(' << Real << " , " << Image << ')' << endl; } void main() { Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; Complex c ; c = c1 ­ c2 ; // operator­(c1,c2) c.print() ; c = 25 + c2 ; // operator+(25,c2) c.print() ; c = c2 + 25 ; // operator+(c2,52) c.print() ; c = ­ c1 ; // operator­(c1) c.print() ; } 当一个运算符的操作需要修改类对象状态时,应该以成员函数重载。例如,需要左值操 作数的运算符(如 =,*=,++ 等)应该用成员函数重载。如果以友员函数重载,可以使用 引用参数修改对象。 当运算符的操作数(尤其是第一个操作数)希望有隐式转换,则重载算符时必须用友员 函数或普通函数。 C++中不能用友员函数重载的运算符有 = () [] -> 6.3 几个典型运算符重载 本节讨论在数学类中常用的几个运算符重载的特点和应用。 6.3.1 重载 ++ 与 ­­ 自增和自减运算符有前置和后置两种形式。每个重载运算符的函数都必须有明确的特 征,使编译器确定要使用的版本。C++规定,前置形式重载为一元运算符函数,后置形式重 载为二元运算符函数。 【例 6­4】例 6­2 中使用了成员函数重载++和­运算符。本例用友员函数重载++运算符。 设有简单类定义 class Increase { public : Increase() ; … friend Increase operator ++ ( Increase & ) ; friend Increase operator ++ ( Increase & , int ) ; private : unsigned value ; } ; 则前置重载的实现为: Increase operator++ ( Increase & a ) { a.value ++ ;

c语言 重载 赋值运算符

c语言 重载 赋值运算符

c语言重载赋值运算符C语言作为一门高级编程语言,提供了丰富的功能以满足各种编程需求。

其中,运算符重载就是一项非常重要的特性。

运算符重载可以让程序员自定义已有运算符在新类型上的操作方式,使得语言更加灵活和强大。

本文将详细介绍C语言中赋值运算符的重载,包括重载的原理、步骤、方法以及注意事项。

1.C语言中的重载概念C语言中的运算符重载是指在已有的运算符上,根据运算对象的类型,赋予新的操作含义。

这种重载是基于类型的,不同类型之间的运算符重载有不同的处理方式。

运算符重载可以让原有运算符在特定类型上具有更符合语义的操作方式,例如对赋值运算符的重载可以让赋值操作更加直观。

2.赋值运算符的重载原理在C语言中,赋值运算符"="原本用于将右侧的值赋给左侧的变量。

当我们对赋值运算符进行重载时,实际上是将原有赋值操作转换为一个新的表达式,这个表达式中包含了重载后的赋值操作。

重载后的赋值运算符需要满足以下条件:- 重载后的赋值运算符仍为一个二元运算符。

- 重载后的赋值运算符的优先级和结合性与其他运算符保持一致。

- 重载后的赋值运算符需要考虑运算对象的类型,以实现正确的赋值操作。

3.重载赋值运算符的步骤与方法重载赋值运算符的步骤如下:- 定义一个函数,该函数的参数列表中包含一个或多个变量引用。

- 在函数体中,对传入的变量进行操作,以实现重载后的赋值操作。

- 使用函数返回值替换原赋值表达式中的右侧值。

以下是一个重载赋值运算符的示例:```c#include <iostream>class MyClass {public:void operator=(const MyClass& other) {// 实现重载后的赋值操作std::cout << "重载赋值运算符被调用" << std::endl;}};int main() {MyClass obj1;MyClass obj2;obj1 = obj2; // 调用重载后的赋值运算符return 0;}```4.重载赋值运算符的注意事项- 重载赋值运算符时,需要确保运算对象具有可赋值性。

C++运算符重载讲解与经典实例 (2)

C++运算符重载讲解与经典实例 (2)
运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不很明显的运算时,编译程序将去寻找参数相匹配的运算符函数。
5.重载运算符有哪些限制:
(1)不可臆造新的运算符。必须把重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中。
(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i
在程序中,类complex定义了4个成员函数作为运算符重载函数。将运算符重载函数说明为类的成员函数格式如下:
<类名>operator<运算符>(<参数表>)
其中,operator是定义运算符重载函数的关键字。
程序中出现的表达式:
位操作运算符:&,|,~,^,<<,>>
逻辑运算符:!,&&,||;
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。
double real;
double imag;
};
complex a(10,20),b(5,8);
“a+b”运算如何实现?这时候我们需要自己编写程序来说明“+”在作用于complex类对象时,该实现什么样的功能,这就是运算符重载。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。
运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。
运算符重载为类的成员函数的一般语法形式为:

c++结构体重载运算符

c++结构体重载运算符

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

详解C++编程中的重载流插入运算符和流提取运算符

详解C++编程中的重载流插入运算符和流提取运算符

详解C++编程中的重载流插⼊运算符和流提取运算符C++的流插⼊运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输⼊流类istream和输出流类ostream。

cin和cout分别是istream类和ostream类的对象。

在类库提供的头⽂件中已经对“<<”和“>>”进⾏了重载,使之作为流插⼊运算符和流提取运算符,能⽤来输出和输⼊C++标准类型的数据。

因此,凡是⽤“cout<<”和“cin>>”对标准类型数据进⾏输⼊输出的,都要⽤#include 把头⽂件包含到本程序⽂件中。

⽤户⾃⼰定义的类型的数据,是不能直接⽤“<<”和“>>”来输出和输⼊的。

如果想⽤它们输出和输⼊⾃⼰声明的类型的数据,必须对它们重载。

对“<<”和“>>”重载的函数形式如下:istream & operator >> (istream &, ⾃定义类 &);ostream & operator << (ostream &, ⾃定义类 &);即重载运算符“>>”的函数的第⼀个参数和函数的类型都必须是istream&类型,第⼆个参数是要进⾏输⼊操作的类。

重载“<<”的函数的第⼀个参数和函数的类型都必须是ostream&类型,第⼆个参数是要进⾏输出操作的类。

因此,只能将重载“>>”和“<<”的函数作为友元函数或普通的函数,⽽不能将它们定义为成员函数。

重载流插⼊运算符“<<”在程序中,⼈们希望能⽤插⼊运算符“<<”来输出⽤户⾃⼰声明的类的对象的信息,这就需要重载流插⼊运算符“<<”。

[例] ⽤重载的“<<”输出复数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<iostream.h> class complex{ public: complex(double r=0.0,double i=0.0); void print (); friend complex operator+(complex a,complex b); friend complex operator-(complex a,complex b); operatorfriend complex operator*(complex a,complex b); friend complex operator/(complex a,complex b); private: double real; double imag; };
complex:: complex(double r,double i); { real=r; imag=i;} complex operator+(complex a,complex b); { complex temp; temp.real=a.real+b.real; temp.imag=a.imag+b.imag; return temp;} complex operator-(complex a,complex b); operator{ complex temp; temp.real=a.real-b.real; temp.real=a.realtemp.imag=a.imagtemp.imag=a.imag-b.imag; return temp;} complex operator*(complex a,complex b); { complex temp; temp.real=a.real*b.real-imag*b.imag; temp.real=a.real*b.realtemp.imag=a.real*b.imag+imag*b.real; return temp;} complex operator/(complex a,complex b); { complex temp; double t; t=1/(b.real*b.real+b.imag*b.imag); temp.real=(a.real+b.real+a.imag*b.imag)*t; temp.imag=(b.real+a.realtemp.imag=(b.real+a.real-a.imag*b.imag)*t; return temp;} void complex::print() { cout<<real; if(imag>0) cout<<"+"; if(imag!=0) cout<<imag<<"i\ cout<<imag<<"i\n";}
友元运算符函数
• 概念 • 友元运算符函数定义的语法形式
声明
friend type operator@(形数表); operator@(形数表 形数表);
定义
type operator@(形数表) operator@(形数表 形数表) { //函数体} //函数体 函数体}
• 其中,type(<函数类型>)指定了重载运算符的返回值类型, 其中,type( 函数类型>)指定了重载运算符的返回值类型, >)指定了重载运算符的返回值类型 operator是定义运算符重载函数的关键词 是定义运算符重载函数的关键词, 运算符>) >)给 operator是定义运算符重载函数的关键词,@(<运算符>)给 定了要重载的运算符名称, C++中可重载的运算符 中可重载的运算符, 定了要重载的运算符名称,是C++中可重载的运算符,形参表 中给出重载运算符所需要的参数和类型 • 由于友元运算符函数不是类的成员函数,所以没有this指针。 由于友元运算符函数不是类的成员函数,所以没有this指针。 this指针 如果重载的运算符函数是双目的运算符, 如果重载的运算符函数是双目的运算符,则参数表中有两个 操作数,若为单目运算符, 操作数,若为单目运算符,则参数表中有一个操作数
ቤተ መጻሕፍቲ ባይዱ
错误原因在于complex类类型不是预定义的基本数据类型, 错误原因在于complex类类型不是预定义的基本数据类型, complex类类型不是预定义的基本数据类型 而是用户自定义的数据类型。C++知道如何相加两个int数据 知道如何相加两个int数据, 而是用户自定义的数据类型。C++知道如何相加两个int数据, 或相加两个float型数据,甚至知道如何把一个int float型数据 int型数据与 或相加两个float型数据,甚至知道如何把一个int型数据与 一个float型数据相加,但是C++ float型数据相加 C++并不知道怎样将两个 一个float型数据相加,但是C++并不知道怎样将两个 complex类类型的对象进行相加,这样需要我们来重载“ complex类类型的对象进行相加,这样需要我们来重载“+” 类类型的对象进行相加 运算符来解决两对象相加的问题
第7章 运算符重载
本章主要内容
7.1 引入运算符重载的原因及运算符重载的规则 7.2 运算符重载函数的两种形式 7.3 几种常用运算符的重载 7.4 类型转换
本章重点
几种常用运算符的重载与类型转换
本章难点
单目运算符“++” 单目运算符“++”与“—”的重载
本章所需学时: 本章所需学时:
4学时
§7.1 运算符重载概述
§7.2 运算符重载两种形式
运算符重载与函数重载相似,其目的是设置某一运算符,让 运算符重载与函数重载相似,其目的是设置某一运算符, 它具有另一种功能,尽管此运算符在原先C++ C++语言中代表另 它具有另一种功能,尽管此运算符在原先C++语言中代表另 一种含义,但他们彼此之间并不冲突。C++会根据运算符中 一种含义,但他们彼此之间并不冲突。C++会根据运算符中 的操作数来辨别应使用哪一种功能进行运算。 的操作数来辨别应使用哪一种功能进行运算。在类外定义运 算符重载函数,只能对类公有数据成员进行操作。实际上, 算符重载函数,只能对类公有数据成员进行操作。实际上, 运算符的重载有两种形式:定义为类的类友元函数; 运算符的重载有两种形式:定义为类的类友元函数;定义为 它将要操作的类的成员函数。前者称为友元运算符函数, 它将要操作的类的成员函数。前者称为友元运算符函数,后 者为成员运算符函数。 者为成员运算符函数。
运算符重载的规则
重载运算符与预定义运算符的使用方法完全相同,被重载的 重载运算符与预定义运算符的使用方法完全相同, 运算符不改变原来的操作数个数、优先级和结合性。 运算符不改变原来的操作数个数、优先级和结合性。 重载的运算符只能是运算符集中的运算符, 重载的运算符只能是运算符集中的运算符,不能另创新的运 算符。 算符。 运算符的含义可以改变,但最好不改变。 运算符的含义可以改变,但最好不改变。如实数的加法运算 可以用乘法运算符来实现 C++中 大多数系统预定义运算符可以把被重载, 在C++中,大多数系统预定义运算符可以把被重载,但也有 些运算符不能被重载如:类属关系运算符“ 些运算符不能被重载如:类属关系运算符“.”、成员指针 运算符“ 作用域分辨符“::” sizeof运算符和 运算符“*”、作用域分辨符“::”、sizeof运算符和 三目运算符“?:” 三目运算符“?:” 不能改变运算符对预定义类型的操作方式
complex operator+(complex com1,complex com2)
• { • complex temp; • temp.real=com1.real+com2.real; • temp.real=com1.imag+com2.imag; • return temp; • } 其中主函数的 • total=com1+com2;(隐式调用) ;(隐式调用 total=com1+com2;(隐式调用) 语句也可以写成: 语句也可以写成: • 显式调用) total=operator+(com1,com2); (显式调用) 从中可以看出运算符重载进一步提高了面向对象软件系统的 灵活性、 灵活性、可扩充性和可读性
引入运算符重载的原因
• 例如:int a=1,b=2;float c=1.1,d=2.4; 例如: • int e=a+b; float f=c+d; float g=f+e; • 为什么同一个运算符“+”可以用于完成不同类型的数 为什么同一个运算符“ 据的加运算呢?原来C++语言针对预定义数据类型已经对 据的加运算呢?原来C++语言针对预定义数据类型已经对 某些运算符做了适当的重载。 某些运算符做了适当的重载。 • C++语言提供的预定义数据类型终究是有限的,我们在解 C++语言提供的预定义数据类型终究是有限的 语言提供的预定义数据类型终究是有限的, 决多种多样的实际问题 时,往往需要使用许多的自定义 数据类型。例如,在解决科学与工程计算问题时, 数据类型。例如,在解决科学与工程计算问题时,往往 要使用复数、矩阵等。 要使用复数、矩阵等。
下面定义一个简化的复数类complex 下面定义一个简化的复数类complex • class complex{ • public: • double real,imag; • complex(double r=0,double i=0) • {real=r,imag=i;} • main(){ complex com1(1.1,2.2),com2(3.3,4.4),total; • total=com1+com2; //错误 //错误 • //… • return 0; • }
相关文档
最新文档