33.C++函数重载

news2024/11/24 12:46:10

今天进行了新的学习。

目录

1.什么是函数重载?

2.函数重载的规则

代码演示: 

 分析:

3.为什么C++能进行函数重载 

例如: 

调用约定: 

4.extern关键字 


1.什么是函数重载?

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

2.函数重载的规则

  1. 函数的参数列表必须不同,包括参数类型、参数个数或参数顺序。
  2. 返回类型不是重载函数的标准,只有参数列表不同才能构成重载。
  3. 函数重载不仅可以发生在同一个类中,也可以在不同的类中。 

代码演示: 

#include <iostream>
using namespace std;

//函数重载示例
void print(int num) {
	cout << "整数num=" << num << endl;
}

void print(int num,int n) {
	cout << "整数num=" << num ;
	cout << " 整数n=" << n << endl;
}

void print(double num) {
	cout << "浮点数num=" << num << endl;
}

void print(const char* str) {
	cout << "字符串str=" << str << endl;
}

int main() {
	print(10);       //调用void print(int num)
	print(10, 2);    //调用void print(int num,int n)
	print(10.1);	 //调用void print(double num)
	print("hello");  //调用void print(const char* str)

	return 0;
}

 

 分析:

       在上面的示例中,通过函数重载,定义了四个具有相同名称的“print”函数,但他们的参数列表分别是“int”,''int int",''double","const char*"。根据调用时的参数类型,编译器会自动进行合适的函数进行调用。 

3.为什么C++能进行函数重载 

1.C++能够进行函数重载是因为它支持多态性编译时多态的特性。

2.函数重载的过程中,编译器会对函数名进行一种称为"名称修饰"或"名字粉碎"(Name Mangling)的操作。在C++中,名称修饰的具体规则是由编译器决定的,因此在不同的编译器和平台上,名称修饰的方式可能会有所不同。

例如: 

           对于以下两个函数的声明: 

void foo(int a);
void foo(double a);

          编译器可能将他们的名称修饰为:

foo_i   // 表示参数为int类型的foo函数
foo_d   // 表示参数为double类型的foo函数

 这样,在函数调用时,编译器会根据函数参数的类型来选择正确的函数进行调用。

调用约定: 

调用约定(calling convention)是指函数在编译和调用过程中所遵循的一组规则,用于确定函数参数的传递方式、堆栈的管理方式以及函数返回值的处理方式。不同的调用约定可以影响函数在内存中的布局和调用过程中的行为。

常见的调用约定有以下几种:

  1. __cdecl:参数从右向左依次压入堆栈,由调用者负责清理堆栈空间。返回值通常通过寄存器传递,如果返回值的大小超过了寄存器的容量,则通过堆栈返回。__cdecl 是 C 和 C++ 默认的调用约定。

  2. __stdcall:参数从右向左依次压入堆栈,由被调用函数负责清理堆栈空间。返回值通过寄存器传递。与 __cdecl 不同,__stdcall 在函数调用过程中会对参数和函数名进行修饰,以确保函数名的唯一性。

  3. __fastcall:部分参数通过寄存器传递,剩余参数从右向左依次压入堆栈,由被调用函数负责清理堆栈空间。返回值通过寄存器传递。__fastcall 通过减少对堆栈的访问来提高函数调用的性能。

  4. __thiscall:用于 C++ 类成员函数的调用约定,将 this 指针作为隐式参数传递给函数。this 指针通常存储在 ECX 寄存器中。

 

#include <iostream>
using namespace std;

// 函数使用 __cdecl 调用约定
int __cdecl Add_cdecl(int a, int b)
{
    return a + b;
}
// 函数使用 __stdcall 调用约定
int __stdcall Add_stdcall(int a, int b)
{
    return a + b;
}
// 函数使用 __fastcall 调用约定
int __fastcall Add_fastcall(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 5;
    int b = 10;
    // 调用 __cdecl 函数
    int result_cdecl = Add_cdecl(a, b);
    cout << "Result (cdecl): " << result_cdecl << endl;
    // 调用 __stdcall 函数
    int result_stdcall = Add_stdcall(a, b);
    cout << "Result (stdcall): " << result_stdcall << endl;
    // 调用 __fastcall 函数
    int result_fastcall = Add_fastcall(a, b);
    cout << "Result (fastcall): " << result_fastcall << endl;

    return 0;
}

4.extern关键字 

extern "C" : 函数名以C的方式修饰约定规则;
extern "C++" : 函数名以C++的方式修饰约定规则; 

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

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

相关文章

Nodejs安装以及环境变量配置

Nodejs安装以及环境变量配置 1.下载Nodejs1.1最新版下载1.2历史版本下载 2.安装3.验证4.环境变量配置5.npm下载设置6.测试6.设置国内镜像提高下载速度 1.下载Nodejs 1.1最新版下载 直接官网下载&#xff1a;https://nodejs.org/zh-cn/download 根据自己的需求&#xff0c;选择…

关于两个项目用的不是同一个node的解决 办法

问题描述&#xff1a; 两个前端项目&#xff0c;使用的不是同一个版本的node 和npm &#xff0c;导致总有一个项目启动不了&#xff0c;如何解决这个问题呐&#xff1f; 解决工具&#xff1a; nvm&#xff1a;node 版本管理器&#xff0c;也就是说&#xff1a;一个 nvm 可以管理…

Dubbo高可用

1.zookeeper宕机与dubbo直连 1.1.现象&#xff1a;zookeeper注册中心宕机&#xff0c;还可以消费dubbo暴露的服务。 原因&#xff1a; 监控中心宕掉不影响使用&#xff0c;只是丢失部分采样数据数据库宕掉后&#xff0c;注册中心仍能通过缓存提供服务列表查询&#xff0c;但…

常见的Linux发行版配置要求到底有多低?

常见的Linux发行版配置要求主要包括以下几个方面&#xff1a; 处理器&#xff1a; 一般来说&#xff0c;64位的Linux发行版需要至少2GHz的CPU速度&#xff0c;对于较老的处理器&#xff0c;可以选择使用32位的Linux发行版。 内存&#xff1a; Linux发行版通常需要至少1GB的…

AdaIN

AdaIN的全名是Adaptive Instance Normalization&#xff0c;源自风格迁移的论文Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization 假设原图和风格图经过VGG进行特征提取后得到shape分别为CxHxW和CxH‘xW’的特征图c和s&#xff0c;AdaIN的计算如…

AspNetCore中的依赖注入详解

1 概述 ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务&#xff0c;为了方便对这些组件进行定制&#xff0c; ASP.NET Core通过定义接口的方式对它们进行了“标准化”&#xff0c;我们将这些标准化的组件称为服务&#xff0c; …

【高数+复变函数】Laplace变换

文章目录 【高数复变函数】Laplace变换1. 问题引入及定义2. 存在定理3. 常见Laplace变换 【高数复变函数】Laplace变换 1. 问题引入及定义 上一节&#xff1a;【高数复变函数】傅里叶积分 回顾之前我们讲的傅里叶变换要满足的条件有&#xff08;也就是傅里叶积分要满足的条件…

RL - 强化学习 Decaying Epsilon Greedy 算法解决多臂老虎机问题

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130945234 Decaying Epsilon Greedy 算法是一种强化学习中的探索策略&#xff0c;可以平衡开发和探索之间的矛盾。基本思想是&#xff0…

第15章:索引的数据结构

一、为什么使用索引 1.索引是存储引擎用于快速找到记录的一种数据结构。相当于一本书的目录。在进行数据查找时&#xff0c;首先查看查询条件是否命中某条索引&#xff0c;符合则通过索引查找相关数据。如果不符合则需要全表扫描&#xff0c;一条一条查找记录&#xff0c;直到…

Layui源码解读之define函数

一、layui.define 用法 layui.define([mods], callback) 通过layui.define该方法可在新的 JS 文件中定义一个 layui 模块。 mods 是可选的&#xff0c;用于声明该模块所依赖的模块。callback 为模块加载完毕的回调函数&#xff0c;它返回一个 exports 参数&#xff0c;用于输出…

鸿蒙App开发选择Java还是JavaScript?

众所周知&#xff0c; Java和 JavaScript是两种编程语言&#xff0c;这两种语言在不同的环境中都有许多用途。在鸿蒙 App开发中&#xff0c; Java和 JavaScript是两种常见的编程语言&#xff0c;它们都具有广泛的应用&#xff0c;并且都有其独特的优势。下面我们将就这两种编程…

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置 1、位置订阅1.1、国标设备编辑1.2、选择设备开启位置订阅1.3、全局开启位置订阅1.4、通过目录订阅获取位置(少数情况) 2、经纬度信息查询2.1、访问接口获取2.1.…

详解iPaaS与RPA的区别及各自的应用场景

随着企业数字化转型的加速&#xff0c;业务系统集成和自动化流程成为关键议题。本文旨在探讨iPaaS&#xff08;Integration Platform as a Service&#xff09;与RPA&#xff08;Robotic Process Automation&#xff09;在业务系统集成方面的区别&#xff0c;它们各自的用途和适…

python数据分析案例——零售商店电子销售订单分析

一、项目背景 通过"扫描"零售商店电子销售点个别产品的条形码而获得的消费品销售的详细数据。 这些数据提供了有关所售商品的数量、特征和价值以及价格的详细信息。 二、数据来源 https://www.kaggle.com/marian447/retail-store-sales-transactions 三、提出问…

windows11@OpenWith@选择文件打开方式导致卡死@windows11任务栏显示秒

文章目录 OpenWith选择文件打开方式导致卡死解决方案 windows11任务栏显示秒显示秒的注册表设置取消显示秒: OpenWith选择文件打开方式导致卡死 关键在于一个名为openwith的进程出现问题该进程有时会卡死,并且无法关闭,这个bug存在很久了,具体参考:Windows11 - Microsoft Comm…

MySQL 多行函数

文章目录 多行函数1. 求 country 表中&#xff0c;所有国家人口的平均值&#xff0c;其 SQL 语句实现如下&#xff1a;2. 求 country 表中&#xff0c;所有国家人口的总数&#xff0c;其 SQL 语句实现如下&#xff1a;3. 求 country 表中&#xff0c;人口最多和最少国家的人口数…

KD7742耐压接地泄漏绝缘四合一并行测试仪

一、产品简介 KD7742耐压接地泄漏绝缘四合一并行测试仪具有交/直流耐压、绝缘电阻等项目的测试分析功能&#xff0c;能显示电压、电流和电阻的波形图以及趋势图&#xff0c;以便更直观的监测分析绝缘性能和绝缘崩溃时的各项指标&#xff0c;适用于高要求的测试分析场合。 产品具…

Pig项目新加权限类型生成Token并且解决验证问题

前言 这个教程可能不是最好的,也许是最直白的,你只需要找到对应的地方跟着博主一起去修改就能操作成功,今天用添加 mini 的授权模式的例子说一下这个 mini 模式是自己自定义的,你想叫什么都行 最近可烦死了快被折磨死人,在昨天睡了一觉,今天就解决问题了…睡一觉就能解决问题,那…

教你一步步使用实现TensorFlow 进行对象检测

在本文中,我们将学习如何使用 TensorFlow Hub 预训练模型执行对象检测。TensorFlow Hub 是一个库和平台,旨在共享、发现和重用预训练的机器学习模型。TensorFlow Hub 的主要目标是简化重用现有模型的过程,从而促进协作、减少冗余工作并加速机器学习的研发。用户可以搜索社区…

【数据结构与算法分析inC-MarkAllen】2-算法分析

文章目录 第二章——算法分析2.1 算法评价的量化理论2.1.1 函数渐进增长四种渐进增长定义运算法则两个函数相对增长率判断 2.1.2 算法分析的计算机模型2.1.3 要分析的目标最坏情况 2.1.4 一般法则for循环嵌套for循环顺序语句分支语句二分函数调用 2.2 计算方法2.2.1 循环主体中…