函数重载和运算符重载

合集下载

什么是函数重载?

什么是函数重载?

什么是函数重载?

重载决策是⼀种编译时机制,⽤于在给定了参数列表和⼀组候选函数成员的情况下,选择⼀个最佳函数成员来实施调⽤。函数重载就是⼀个类中有⼏个同名函数但参数表不同:

重载分为普通⽅法重载和基类(也就是⽗类)虚⽅法的重载!

普通⽅法的重载指的是:类中两个以上的⽅法(包括隐藏的继承⽽来的⽅法),取的名字相同,但使⽤的参数类型或者参数个数不同!

对基类⽅法的重载是函数重载的另⼀种特殊形式。在派⽣类中重新定义此虚函数!⽅法名称,返回值类型,参数表中的参数个数,类型,顺序都必须和基类中的虚函数完全⼀致!在派⽣类中声明对虚⽅法的重载,要求在声明中加上override关键字,⽽且不能有new,static或virtual修饰符!

例⼦:

void foo(int i);

void foo(double d);

void foo(System.Object obj);

PS:运算符重载 ^_^,附带说说,⼀直认为⽅法才可以重载,原来运算符号也可以重载!

所谓运算符的重载指同⼀个运算符可以进⾏不同类型参数的运算!⽐如“+”号,不仅可以进⾏各种数值类型的运算,还可以进⾏⼦串的加法运算!

运算符重载的⼀般形式是:

public static 返回类型 operator 运算符(参数)

{具体代码}

摘⾃雷⽶零度线博客

谭浩强《C++程序设计》课件 第10章

谭浩强《C++程序设计》课件 第10章

c.imag=imag+c2.imag; return c;} void Complex∷display( ) //定义输出函数 ∷ 定义输出函数 {cout<<〃(〃<<real<<〃,〃<<imag<<〃i)〃<<endl;} int main( ) {Complex c1(3,4),c2(5,-10),c3; c3=c1.complex_add(c2); cout<<〃c1=〃; c1.display( ); cout<<〃c2=〃; c2.display( ); cout<<〃c1+c2=〃; c3.display( ); return 0; }
c1.operator+(c2) //其中 和c2是Complex类的对象 其中c1和 是 其中 类的对象
即以c2为实参调用 的运算符重载函数 即以 为实参调用c1的运算符重载函数 为实参调用 operator+(Complex &c2),进行求值,得到两个复 ,进行求值, 数之和. 数之和.
虽然重载运算符所实现的功能完全可以用函数实现, 虽然重载运算符所实现的功能完全可以用函数实现, 但是使用运算符重载能使用户程序易于编写, 但是使用运算符重载能使用户程序易于编写,阅读 和维护.在实际工作中, 和维护.在实际工作中,类的声明和类的使用往往 是分离的.假如在声明Complex类时,对运算符 类时, 是分离的.假如在声明 类时 对运算符+,,*,/都进行了重载,那么使用这个类的用户在编程 都进行了重载, 都进行了重载 时可以完全不考虑函数是怎么实现的, 时可以完全不考虑函数是怎么实现的,放心大胆地 直接使用+,-,*,/进行复数的运算即可,十分方便. 进行复数的运算即可, 直接使用 进行复数的运算即可 十分方便. 对上面的运算符重载函数operator+还可以改写得 对上面的运算符重载函数 还可以改写得 更简练一些: 更简练一些:

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);

c++重载的原理

c++重载的原理

c++重载的原理

C++重载是一种程序设计技术,使得相同的函数名可以同时有多个实现方式。重载的原理是根据函数的不同参数列表来区分函数的实现方式。

在C++中,函数的参数列表决定了函数的唯一标识符,所以在定义和调用函数时,编译器可以根据参数列表来判断函数的实现方式。当函数被调用时,编译器会查找所有同名的函数,并根据参数列表匹配最合适的实现方式。

重载可以发生在全局函数、类成员函数、运算符重载等多种情况下。在全局函数的情况下,可以通过参数的类型、顺序、个数等方式进行重载。而在类成员函数的情况下,则可以通过函数名、参数列表的不同来进行重载。

重载的原理是在编译器中实现的,编译器会将不同的函数名和参数列表的组合转化为唯一的函数标识符,并在程序执行时进行调用。重载可以提高代码的可读性和可维护性,同时也可以减少相似函数的代码冗余。

总之,C++重载是一种非常有用的编程技术,可以使得函数名更加灵活和自由,更好地满足程序的需要。

- 1 -

第7章 函数重载和运算符重载

第7章 函数重载和运算符重载
wk.baidu.com
7.1 函数重载
•7.1.4 默认参数与重载函数 1. 默认参数 在调用某一个函数时,经常使用某一个 特定值作为参数,例如定义了设置扫描 仪状态的函数,扫描仪的状态可以是0 (ready),1(busy)或2(error)。
void SetScannerStatus(int printNo,int state=0)
7.3 运算符重载
运算符重载是对已有的运算符赋予多重 含义,同一个运算符作用于不同类型的 数据导致不同类型的行为。
7.3 运算符重载
表7-1 C++可以重载的运算符
算术运算符 关系运算符 单目运算符 + == +(正) != -(负) -&& ! * < &(取地址) / > * % <= ~ ^ >= & | << >>
7.3 运算符重载
Matrix Matirx::operator *(Matirx & m) { Matrix m3(rows,m.cols); //临时矩阵 int sum; for(int i=0;i<rows;i++) for(int j=0;j<m.cols;j++) { sum=0; for(int k=0;k<cols;k++) sum+=(*this)(i,k)*m(k,j); m3(i,j)=sum; } return m3; }

数据的重载

数据的重载

第1章重载

为减轻程序设计者记忆函数名称的负担,增强程序代码的可读性,C++编译器允许在相同作用域内(全局或某类中)定义两个以上的同名函数,即函数重载。同时,编译器也允许对大部分常规运算符(例如+、-、*、=)重新定义,赋予它们新的操作,即运算符重载。对于重载函数,使用者可以仅知道其一般含义,不必知道它们的实现细节。因此,重载提高了程序的抽象程度,对程序的编写和阅读都有优化作用。

1.1 函数重载

在实际编程中,往往将一组功能非常相近的函数定义为重载函数。

1.1.1 问题的提出

例如,要设计3个函数分别用来输出3种提示信息,采用C语法的声明代码如下:

void ShowMessageA(const char* Text);

void ShowMessageB(const char* Text, unsigned int Type );

void ShowMessageC(const char* Text ,const char* Caption );

而如果采用C++语法,则可以这样声明:

void ShowMessage(const char* Text);

void ShowMessage(const char* Text ,unsigned int Type);

void ShowMessage(const char* Text ,const char* Caption);

这样,只需记住ShowMessage(),即可输出各种提示信息,而代码的阅读者也不会被各种功能和名称相近的函数搞得晕头转向。

1.1.2 如何区分重载函数

运算符重载函数的两种主要方式

运算符重载函数的两种主要方式

运算符重载函数的两种主要方式

运算符重载是C++语言中的一种特性,它可以让用户定义类或结构体中的运算符的行为,以满足用户的需求。换句话说,运算符重载就是在类或结构体中定义新的运算符,以替代原有的运算符。

一般来说,运算符重载通过两种主要方式实现:类内重载和类外重载。

类内重载是将运算符重载函数定义在类内部,该函数的声明必须使用operator关键字。这种方式的优点是可以使用类的受保护成员。类内重载的运算符函数有一个或两个参数,参数的类型是类的类型,或者是类的对象。

类外重载是在类外定义运算符重载函数,该函数的声明仍然要使用operator关键字,但参数的类型是左操作数和右操作数的类型。类外重载的运算符函数有两个参数,参数的类型是左操作数和右操作数的类型。类外重载的优点是可以使用不同类型的操作数,而类内重载的运算符函数只能使用类的类型或类的对象作为参数。

使用运算符重载有很多优点,可以提高程序的可读性,使代码更加容易理解。此外,运算符重载还可以减少代码量,减少函数调用的次数,以及提高程序的效率。

总之,运算符重载是一种有效的编程技巧,可以提高程序的可读性,提高程序的效率,增加程序的可维护性,减少代码量。使用运算符重载,可以使用户能够更加熟练地使用C++语言,也可以更好地保护类的封装性。

简述运算符重载的规则

简述运算符重载的规则

简述运算符重载的规则

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

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

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

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

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

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

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

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

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

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

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

重载的概念(精)

重载的概念(精)

以++为例说明增量运算符的重载方法。
表达式 ++x 返回x加 1 以后的值,x++ 返回 x 加1 以前 的值, ++运算符重载时用不同的参数形式区分这两种 形式。C++约定,前缀方式用operate++()定义,是一个 普通一元成员运算符重载;后缀方式用 operate++(int) 定义,用的是二元成员运算符重载的形式。
v2.print();
重载
}
运行结果为: 4.5 -7.8 -1.5 1.2 3 -3 -6.6 6.6
重载运算符在调用时仍然是靠参数区分的。上例中 重载的运算符“-”,若出现在两个数据之间,只要这两 个数据为相同的基本数据类型、vector类型或其它重载 过的类型,都能正确调用相应的运算代码;若它单独出 现在某个基本数据类型或vector类型等重载过的数据前 面,则自动执行求“相反数”的运算。
级顺序,也不能改变运算符所需操作数的个数。
重载
2.2 类成员运算符重载
运算符重载的基本语法形式如下: 类型 类名::operator 运算符(<参数表>) //运算符函数头 {
//运算符函数体
} 若将运算符函数头中“operator 运算符”部分用普通 函数名代替,则与普通函数运算符函数头形式完全相同。 Operator是专门用于定义重载运算符的系统保留字。在下

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

C++运算符重载讲解与经典实例 (2)
double real;
double imag;
};
complex a(10,20),b(5,8);
“a+b”运算如何实现?这时候我们需要自己编写程序来说明“+”在作用于complex类对象时,该实现什么样的功能,这就是运算符重载。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。
运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。
运算符重载为类的成员函数的一般语法形式为:
函数类型operator运算符(形参表)
{
函数体;
}
运算符重载为类的友元函数的一般语法形式为:
friend函数类型operator运算符(形参表)
{
函数体;
}
其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。
complex operator -(const complex &c);
complex operator *(const complex &c);
complex operator /(const complex &c);
friend void print(const complex &c);
private:
(1)重载运算符含义必须清楚。

函数的重载。

函数的重载。

函数的重载。

函数是一种特殊的语言结构,它用来封装特定的功能并在需要时

调用。函数的重载是指在一个程序中使用同一个函数名,但其参数类

型或数量不同。本文将围绕函数的重载展开,深入探讨其定义、重载

规则以及应用。

一、函数的重载定义

函数的重载是一种多态性,它使得同一个函数名可以被用于不同

类型或数量的参数。它让程序员在编写程序时更加灵活,可以根据需

求而不同。

二、函数的重载规则

1. 函数名称必须相同。

2. 参数类型、数量或顺序必须不同。

3. 重载函数可以有不同的返回类型。

4. 函数重载不能仅仅依靠返回类型的不同来实现,因为编译器将无法

分辨该调用哪一个函数。

5. 重载函数可以位于同一个类中或者不同的类中。

6. 重载函数也可以跨越多个命名空间。

7. C++中的函数重载仅根据函数签名(函数名称和参数列表)来区分,与返回类型无关。

8. 调用重载函数时,编译器会根据传递给函数的参数的数量,类型或

顺序来确定要调用的函数。

三、函数的重载应用

1. 算法函数

在实现某一个算法时,不同的数据类型需要进行不同的操作,这

时候可以采用函数重载的方式来处理。

2. 构造函数

在一个类中如果有多个构造函数,可以通过函数重载的方式来创

建多个构造函数,以满足对象创建时不同的需求。

3. 运算符重载

类中的操作符可以使用函数重载来实现。例如,可以实现不同的数据类型之间的算术操作。

4. 实现多态

在面向对象编程中,多态性是一个重要的概念。函数重载可以实现多态性,使得程序员能够更加灵活地处理数据。

总之,函数的重载是C++语言中非常重要的一项特性,它使得程序员能够编写更加灵活的程序。正确地使用函数重载可以大大提高程序的可读性和可维护性,降低开发成本。在实际的编程中,我们需要充分利用这一特性,以达到更好的编程效果。

实验四 函数和运算符重载

实验四  函数和运算符重载

实验四

函数重载和运算符重载(2学时)

一、实验目的

1.掌握函数的定义和调用方法。

2.练习重载函数的使用,注意与缺省参数的区别。

3.练习函数模板的使用。

4.练习运算符重载。

5.练习使用系统函数。

6.学习使用VC++的debug调试功能,使用step into追踪到函数内部。

二、实验任务

1.定义一个简单的菜单类,运行时显示主菜单,可通过选择进入子菜单(可模仿ATM柜员机的模式,菜单内容可自行设定,相关功能函数可不用实现):

主菜单:取现的子菜单

1.转账 1.500

2.余额查询 2.1000

3.取现 3.1500

Q(退出) 4.返回主菜单

请选择(A/S/F/Q)?

选择相应的选项后悔执行相应模块并回到主菜单,选择Q则退出。

2.编写重载函数Maxl可分别求取两个整数,三个整数,两个双精度数,三个双精度

数的最大值。

3.使用重载函数模板重新实现上小题中的函数Maxl。

4.使用系统函数pow(X,y)计算X y的值,注意包含头文件math.h。

5.用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。

6.写一个点point的类,并重载+实现两个点的坐标相加,和-实现求两点间的距离, >>、<

三、实验步骤

1.考虑抽取菜单的数据和相关操作。

2.分别编写四个同名函数maxl,实现函数重载,在main()函数中测试函数功能。程

序名:lab3_2.cpp。

3.使用函数模板实现求任意类型数的最大值,针对不同的参数个数,编写两个同名

函数模板maxl,其参数个数不同,实现函数重载,在main()函数中测试函数功能。程序名:lab3_3.cpp。

第七章 重载

第七章 重载
面向对象程序设计(C++描述)
成信院 李代伟
第七章


面向对象程序设计(C++描述)
成信院 李代伟
本章主要内容
函数重载的概述 重载决议 根据指针类型重载 名称重整 运算符重载概述 运算符重载的实现 单目运算符重载 ->运算符重载 赋值运算符重载 下标运算符重载 函数调用运算符重载 new与delete运算符重载 逗号运算符重载 类型转换运算符重载
双目运算符重载
13:14 2/69
面向对象程序设计(C++描述)
成信院 李代伟
函数重载概述 函 数 重 载 概 述

为何使用函数重载?

int TwoMin(int a, int b); int ThreeMin(int a, int b, int c); int FourMin(int a, int b, int c, int d); 备极其相似操作的函数我们却起了三 个不同的名字,这样我们需要识记三 个函数名而带来不便,所以c++为了方 便程序员编写程序特别引入了函数重 载的概念来解决此问题。
3/69
以上三个函数都是求最小值,三个具
13:14
面向对象程序设计(C++描述)
成信院 李代伟
函数重载概述 函 数 重 载 概 述

函数重载与运算符重载的应用研究

函数重载与运算符重载的应用研究
p iae: rv t ita: n
} ; vi ma () o i d n { 1a ( ) A a , 1 ;} 2 运行结果为 :
Dea l C n t c ig 0 fut o sr t u n
Co t c ig 1 s u n r tn
i a(n x it ){ tr n m x it , r t x>y : ;/ 求 2个 整 t n Y et u ?x Y }/ 数的最大值 i a (n x it , t )/ 求 3个整数的最大值 n m x it , i / t nY n z {e m ?( >z :) ( >z :) } rt x>y x ?xz : Y ?Y z ; u
例 1中定义 了两个最 大值 m 函数 , 是普通 函数 , x a 都 即非成员 函数 , 分别 求 2个 、 整数 的最大 值。主函数 3个 中, eu 输出流语句 中两 次调用 函数 m , 在 ot x a 由于实参个 数的不 同 , 第一次调用映射 到的是求 2个整数 的最大值 函
2 2成 员 函数 重载 .
多 态性 是 面 向对象 的程 序设 计 中的 三大 基本 特征 ( 封装性 , 继承性 , 多态性 ) 之一 , 其含 义是指 同一个 消息 被不 同类型的对象接收 时会导致 不同 的的行为实现 。在 C++中 , 多态性包括强 制多态 、 载多态 、 数类型多态 重 参 和包含多态四种。其 中, 重载是实现 C++多态性 的一种 重要机制 , 为重载 多态, 称 即为程序 正文 中相 同作用域 内 的的同一个标识符赋予不同的操作语义 , 实质上也就是 实 现了程序空间到代码空 间的一对 多映射 。重 载在 C+ + 中可分为两种 : 函数重载和运算符重载 。 2 .函数 重 载 在程序编译时 , 让相同的函数名映射到不同的函数代 码, 称为函数重载。在 C++中, 函数 重载 可以分别 以普 通函数 和成员 函数来实现。 2 1普 通 函 数 重 载 .

第四章 运算符重载

第四章 运算符重载

例4.1 通过成员函数实现复数的加法。 class Complex { private: double real; double imag; public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex complex_add(Complex &c2); void display(); };
Complex Complex::operator + (Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; }
void Complex::display() { cout<<"("<<real<<","<<imag<<"i)"<<endl; }
Complex operator+ (Complex &c1, Complex &c2) { return Complex(c1.rewk.baidu.coml+c2.real, c1.imag+c2.imag) ; } // 显式调用构造函数 void Complex::display() {cout<<"("<<real<<","<<imag<<"i)"<<endl;}

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详

三种重载⽅式

⾸先,介绍三种重载⽅式:

1//作为成员函数重载(常见)

2class Person{

3 Private:

4string name;

5int age;

6public:

7 Person(const char* name, int age):name(name),age(age){}

8bool operator<(const Person& b);

9

10 };

11bool Person::operator<(const Person& b)

12 {

13//作为成员函数时,*this即为左操作数a

14 ...

15 }

1//作为友元函数重载

2class Person{

3private:

4string name;

5int age;

6public:

7 Person(const char* name, int age):name(name),age(age){}

8 friend bool operator<(const Person& a,const Person& b);

9

10 };

11bool operator<(const Person& a,const Person& b)

12 {

13 ...

14 }

1//作为普通函数重载(不推荐)

2class Person{

3public://注意,重载运算符为普通函数时,使⽤到的类成员必须为public

4string name;

5int age;

6public:

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

本章内容第四章

本章内容

类中成员函数

class print{不要将不同功能的函数定义为重载函数,以

本章内容

问题

例:字符串处理

//

C++

s1 = "Hello";

s2 = "world";

string s3;

s3 = s1; //

cout<

s3 = s1 + s2; //

cout<

运算符函数

运算符函数的调用形式

//例4_4 complex complex::operator void complex::display()

c.imag=c2.imag+imag;

return complex(c.real,c.imag); }

c.imag=imag-c2.imag;return complex(c.real,c.imag);}

如果需要重载一个运算符,使之能够用于//例4_5 以复数

本章内容complex operator +(complex c1,complex c2)

//例4_6 浅拷贝void main()

浅拷贝策略:逐个成员依次拷贝

Person:: Person(char* pN)

{ cout<<"

完成简单的一一对应的复制的拷贝构造函数称 拷贝构造函数的调用 默认的赋值运算符 例:

class B{多态性概述

以weight为例,实现如何重载++运算符//前增量++x

//例4_10 重载运算符++(友元函数)44

4.5.1 重载运算符++和—

CVector::CVector(const int& CVector::operator[](unsigned int& operator[](unsigned CVector& operator=(const CVector&v);CVector& operator=(int ~CVector(void) { delete[]elem; }

插入运算符<<

//例4_12

#include

class Complex{// 复数类作用:例4_13 //例4_14

当一个运算符表达式出现时,编译器将按下面的顺例4_15

本章上机题目:class String

相关文档
最新文档