C++ 重载

C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。

重载声明

是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。

重载声明

当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。

函数重载

函数名相同,参数列表(参数个数、参数类型、参数顺序)相同,函数返回值相同,称为函数重定义;

函数名相同,参数列表(参数个数、参数类型、参数顺序)不同,称为函数重载。

在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。不能仅通过返回类型的不同来重载函数。

#include <iostream>
using namespace std;
class printData
{public:void print(int i) {cout << "整数为: " << i << endl;}void print(double  f) {cout << "浮点数为: " << f << endl;}void print(char c[]) {cout << "字符串为: " << c << endl;}
};
int main(void)
{printData pd;   // 输出整数pd.print(5);     // 输出浮点数pd.print(500.263);   // 输出字符串char c[] = "Hello C++";pd.print(c);return 0;
}

重载规则

1.函数名相同

2.参数个数不同,参数的类型不同,参数顺序不同,均可构成重载

3.返回值类型不同则不可以构成重载【函数的返回值类型可以不同,但是两个函数只是返回返回值类型不同,不可重载】

调用准则

1.严格匹配,找到则调用

2.通过隐式转换寻求一个 匹配,找到则调用

如果能够严格匹配,调用完全匹配的

如果没有完全匹配,调用隐士匹配的

以上都匹配不到的,调用失败。

编译器调用重载函数的准则

1.将所有同名函数作为候选者

2.尝试寻求可行的候选函数

3.精确匹配实参

4.通过默认参数能够匹配实参

5.通过默认类型转换匹配实参

6.匹配失败

7.最终寻找到的可行候选函数不唯一,则出现二义性,编译失败

8.无法匹配所有候选者,函数未定义,编译失败

重载底层实现

C++利用name mangling(倾轧)技术,来改名函数,区分参数不同的同名函数。

实现原理

用v c i f l d表示void char int float long double及其引用

void func(char a); //func_c(char a)

void func(char a,int b,double c); //func_cid(char a,int b,double c)

函数重载与函数默认参数

一个函数,不能既作重载,又作默认参数的函数。当你少写一个参数时,系统无法确认是重载还是默认参数。

函数重载与函数指针结合

实际上,在给函数指针赋值的时候,是会发生函数重载匹配的,在调用函数指针的时候,所调用的函数就已经固定了。而普通的重载,是在函数调用的时候进行匹配的。

函数指针:指向函数的指针

函数重载总结

1.重载函数在本质上是相互独立的不同函数

2.函数的函数类型是不同的

3.函数返回值不能作为函数重载的依据

4.函数重载是由函数名和参数列表决定的

友元函数

友元函数是一种对面对对象程序中类的破坏,可以访问私有成员。

一般格式

加friend关键字即可

重载运算符

friend函数类型 operator 运算符名称 (形参表列)

{

对运算符的重载处理

}

运算符重载

借助类中的成员函数完成。

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的【二者之间没有空格】。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

返回值类型 operator运算符(参数列表);

对象 运算符 对象;对象 运算符 常数;常数 运算符 对象

第一个参数是对象,可以使用全局、友元、成员,推荐使用成员函数重载。

第一个参数是常数,跨源使用全局、友元。

友元函数重载,可以说是介于成员函数重载和全局函数重载之间。

对象作为参数进行传递,对象的属性使用 this 运算符进行访问,如下所示:

作为全局函数使用

#include<iostream>
using namespace std;
class A {
public:A(int a, int b) {this->a = a;this->b = b;}void printA() {cout << "(" << this->a << "," << this->b << ")" << endl;}friend A operator+(A& c1, A& c2);
private:int a;int b;
};
A operator+(A& c1, A& c2) {                         //全局函数A temp(c1.a + c2.a, c1.b + c2.b);return temp;
}
int main() {A c1(1, 2);A c2(3, 4);c1.printA();c2.printA();A c3 = opertor + (c1, c2);  //等价于 A c3=c1+c2;c3.printA();return 0;
}

作为类成员函数

#include<iostream>
using namespace std;
class A {
public:A(int a, int b) {this->a = a;this->b = b;}void printA() {cout << "(" << this->a << "," << this->b << ")" << endl;}A operator+(A& another) {          //类内成员函数A temp(this->a + another.a, this->b + another.b);return temp;}
private:int a;int b;
};
int main() {A c1(1, 2);A c2(3, 4);c1.printA();c2.printA();A c3=c1.operator+(c2);  //等价于 A c3=c1+c2;c3.printA();return 0;
}

在用户自定义类型中使用操作符来表示所提供的某些操作,可以收到同样的效果,但前提是它们与基本类型用操作符表示的操作、与其他用户自定义类型用操作符表示的操作之间不存在冲突与二义性。(即在某一特定位置上,某一操作符应具有确定的、唯一的含义)
编译程序能够对是否存在冲突与二义性作出判断的依据,是类型及其操作集。

方法

运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。从某种程度上看,运算符重载也是函数的重载。但运算符重载的关键并不在于实现函数功能,而是由于每种运算符都有其约定俗成的含义,重载它们应是在保留原有含义的基础上对功能的扩展,而非改变。

一般格式

函数类型 operator 运算符名称 (形参表列)//新的函数名

{

对运算符的重载处理

}

operator是c++的关键字,专门用于定义重载运算符的函数。

operator运算符名称 就是函数名,表示对该运算符的重载。

omplex operator+ (Complex& c1,Complex& c2);

//将“+”用于Complex类(复数)的加法运算,函数的原型

当重载函数是类中的成员函数,有一个参数是隐含的,函数是用this指针隐式地访问类对象的成员。

c3=c1+c2

最后在C++编译系统中被解释为:

c3=c1.operator+(c2)

在此例中,operator+是类的成员函数。第一操作数为“*this(c1)”,第二操作数为“参数(c2)”。

实质

操作符的重载就是函数的重载,在程序编译时把指定的运算表达式转换成对运算符的调用,把运算的操作数转换成运算符函数的参数,根据实参的类型决定调用哪个操作符函数。

基本前提/规则

1.只能为自定义类型重载操作符;
2.不能对操作符的语法(优先级、结合性、操作数个数、语法结构) 、语义进行颠覆;
3.不能引入新的自定义操作符;

4.重载运算符的函数不能有默认的参数;

5.重载运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用);

6.用于类对象的运算符一般必须重载,但有两个例外,“=”和“&”不必用户重载;

7.应当使重载运算符的功能类似于该运算符作用于标准类型数据时候时所实现的功能。

8.运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数,也不是友元函数的普通函数。

可重载运算符

不可重载运算符

全局重载

友元重载

成员重载

赋值(=)、下标([])、调用(())和成员访问箭头(->)运算符必须是成员(函数)。

双目运算符重载——全局两参,成员一参

+= 、-=

单目运算符重载——全局一参,成员无参

前++

后++

输入输出运算符重载

<<、>>

友员还是成员

1.一个操作符的左右操作数不一定是相同类型的对象,这涉及到将该操作符函数定义为谁的友员,谁的成员问题。

2.一个操作符函数,被声明为哪个类的成员,取决于该函数的调用对象(通常是左操作数)

3.一个操作符函数,被声明为哪个类的友员,取决于该函数的参数对象(通常是右操作数)

赋值运算符重载

用一个已有对象,给另外一个已有对象赋值。两个对象均已创建结束后,发生的赋值行为。

类名

{

   类名& operator=(const 类名& 源对象) 拷贝体

}

class A

{

   A& operator=(const A& another){

      函数体

      return *this;

   }

};

规则

1.系统提供默认的赋值运算符重载,一经实现,不复存在。

2.系统提供的也是等位拷贝,也就是浅拷贝,一个内存泄漏,重析构。

3.要实再深深的赋值,必须自定义。

4.自定义面临的问题有三个:

a.自赋值

b.内存泄露

c.重析构

5.返回引用,且不能用const析构。其目的是实现连等式。

数组下标运算符(operator[])

类型 类::operator[](类型);

设x是类X的一个对象,则表达式x[y]

可被解释为x.operator[](y)

函数调用符号(operator())

把类对象像函数名一样使用。

仿函数,就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

class 类名{

返回值类型 operator()(参数类型) 函数体

}

不可重载&&和||操作符

->和*重载格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/121531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSSCTF做题第9页(3)

[GKCTF 2020]CheckIN 代码审计 这段代码定义了一个名为ClassName的类&#xff0c;并在脚本的最后创建了一个ClassName类的实例。 在ClassName类的构造函数中&#xff0c;首先通过调用$this->x()方法获取了请求参数$_REQUEST中的值&#xff0c;并将其赋值给$this->code属性…

京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜

鲸参谋监测的京东平台9月份扫地机器人市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;9月份&#xff0c;京东平台扫地机器人的销量近14万&#xff0c;环比增长约2%&#xff0c;同比降低约4%&#xff1b;销售额为2.9亿&#xff0c;环比降低约4%&#xff0…

threejs(7)-精通粒子特效

一、初识Points与点材质 // 设置点材质 const pointsMaterial new THREE.PointsMaterial(); import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 导入动画库 import gsa…

Linux云服务器限制ip进行ssh远程连接

对Linux云服务器限制IP进行SSH远程连接的原因主要有以下几点&#xff1a; 增加安全性&#xff1a;SSH是一种加密的网络传输协议&#xff0c;可以保护数据的机密性和完整性。通过限制SSH连接的IP地址&#xff0c;可以防止未经授权的访问和数据泄露。只有拥有访问权限的IP地址才…

Makefile三个版本的编写

1.Makefile Makefile是一个工程管理文件&#xff0c;简化编译的流程&#xff0c;完成自动化编译的过程 在Makefile中&#xff0c;会把编译的过程分为两步&#xff0c;先生成.o文件&#xff0c;再对.o文件链接&#xff0c;生成可执行文件 Makefile由变量、函数、和规则构成 2.引…

辅助驾驶功能开发-执行器篇(03)-Mobileye Control Requirements

1. 目的 本文描述了产品开发不同阶段(研发、验证和产品化)车辆集成的控制要求。 2. 控制接口要求 2.1 接口类型 控制模块与车辆之间的接口应基于CAN协议或Flexray协议。 2.2 通讯频率 控制模块与车辆之间的通讯频率应高于36Hz。通信频率优先选择为 50 Hz。 2.3 延迟 所有…

vulnhub_DeRPnStiNK靶机渗透测试

VulnHub2018_DeRPnStiNK靶机 https://www.vulnhub.com/entry/derpnstink-1,221/ flag1(52E37291AEDF6A46D7D0BB8A6312F4F9F1AA4975C248C3F0E008CBA09D6E9166) flag2(a7d355b26bda6bf1196ccffead0b2cf2b81f0a9de5b4876b44407f1dc07e51e6) flag4(49dca65f362fee401292ed7ada96f9…

ResNet简单解释

什么是Resnet&#xff1f; resnet是一种残差网络&#xff0c;简单看一下resnet的结构 上面是ResNet&#xff0c;下面是传统的 ResNet里的一小块就是这样的 为什么要引入ResNet&#xff1f; 理论上讲&#xff0c;随着网络加深&#xff0c;我们获取的信息越来越多多&#xff0…

WordPress主题模板 大前端D8 5.1版本完整开源版源码简洁大气多功能配置

源码测评&#xff1a;该模板官方已更新至5.2&#xff0c;但是这个5.1也是非常好用的&#xff0c;经测试所有页面均完好&#xff0c;推荐下载使用。 模板简介&#xff1a; 大前端D8 主题是一款非常牛逼的WordPress博客主题,响应式,功能齐全,支持手机,电脑,平板,非常适合做博客站…

​iOS安全加固方法及实现

目录 iOS安全加固方法及实现 摘要 引言 iOS安全加固方法及实现 一、字符串加密 二、类名方法名混淆 三、程序代码混淆 四、加入安全SDK 总结 参考资料 摘要 本文介绍了iOS平台下的应用安全保护方法&#xff0c;包括字符串加密、类名方法名混淆、程序代码混淆和加入安全…

User CSS 在性能优化方面的实践

目录 前言 1. 减少重绘和回流 1.1 用法 1.2 代码示例 1.3 理解 2. 使用CSS精灵 2.1 用法 2.2 代码示例 2.3 理解 3. 压缩CSS文件 3.1 用法 3.2 代码示例 3.3 理解 4. 使用媒体查询进行响应式设计 4.1 用法 4.2 代码示例 4.3 理解 5. 使用CSS预处理器和构建工…

2015年亚太杯APMCM数学建模大赛A题海上丝绸之路发展战略的影响求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 A题 海上丝绸之路发展战略的影响 原题再现 一带一路不是实体或机制&#xff0c;而是合作与发展的理念和主张。凭借现有有效的区域合作平台&#xff0c;依托中国与有关国家现有的双边和多边机制&#xff0c;利用古丝绸之路的历史象征&#xff0…

【跟小嘉学 Rust 编程】三十三、Rust的Web开发框架之一: Actix-Web的基础

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

定义USB接口,鼠标类和键盘类都可以作为实现类去实现USB接口

目录 程序设计 程序分析 系列文章 ​ 如图所示,我们电脑上都有USB接口,当我们的鼠标和键盘插上去之后才可以使用,拔出来就关闭使用。其实具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范…

专家级数据恢复:UFS Explorer Professional Recovery Crack

UFS Explorer Professional Recovery - 一款功能强大且方便的数据恢复程序&#xff0c;支持检测大量文件系统、操作系统和各种类型的驱动器&#xff1a;从简单的闪存驱动器到复杂的复合存储&#xff08;各种级别的 RAID 阵列&#xff09;。 该程序由执业专家开发&#xff0c;并…

可以用商城源码做什么?

商城源码是一个基于电子商务流程的现代化的商城网站程序。它提供了一个完整的电子商务解决方案&#xff0c;包括产品目录、购物车、结账、订单和付款等功能。商城源码可以用于创建各种类型的电子商务网站&#xff0c; 在这篇文章中&#xff0c;我将介绍商城源码可能带来的各种…

【VUE】ArcoDesign之自定义主题样式和命名空间

前言 Arco Design是什么&#xff1f; Arco Design 是由字节跳动推出的企业级产品的完整设计和开发解决方案前端组件库 官网地址&#xff1a;https://arco.design/同时也提供了一套开箱即用的中后台前端解决方案&#xff1a;Arco Design Pro(https://pro.arco.design/) Arco De…

TSINGSEE青犀睡岗离岗检测算法——确保加油站安全运营

众所周知&#xff0c;加油站是一个需要24小时营业的场所&#xff0c;由于夜间加油人员较少&#xff0c;员工极易处于疲劳或者睡眠状态&#xff0c;为保障安全和效率&#xff0c;通过TSINGSEE青犀睡岗离岗检测算法在加油站场景中&#xff0c;可以及时发现工作人员的疲劳状况&…

YOLOv5— Fruit Detection

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营-第7周&#xff1a;咖啡豆识别&#xff08;训练营内部成员可读&#xff09; &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https…

业务架构、应用架构、技术架构、数据架构

架构规划的重要性 如果没有进行合理的架构规划&#xff0c;将会引发一系列的问题。为了避免这些问题的发生&#xff0c;企业需要进行业务架构、应用架构、技术架构和数据架构的全面规划和设计&#xff0c;以构建一个清晰、可持续发展的企业架构。 https://www.zhihu.com/que…