函数重载与函数模板

函数重载与函数模板

函数重载

函数组成

返回类型 函数名称(参数列表){函数体}

函数签名:函数名称(参数列表)

C++ 允许定义同名函数,前提是它们具有不同的签名。这被称为函数重载 。

C++ 编译器通过检查调用中参数的数量、类型和顺序来选择要调用的适当函数。

//重载函数
//函数名称一致,但参数列表中参数类型、顺序不同
int square(int x){return x*x;
}
double square(double y){return y*y;
}

函数重载的目的:函数重载用于创建多个同名函数,这些函数执行类似任务,但处理不同类型的数据。

编译器如何区分重载函数
重载函数通过其签名来区分。签名是函数名称及其参数类型(按顺序排列 )的组合。类型安全链接可确保调用恰当的函数,且实参的类型与形参的类型相符。为实现类型安全链接,编译器会在内部对每个函数标识符进行编码,编码时纳入其参数的类型 —— 这一过程称为名称修饰(name mangling )。这些编码因编译器而异,因此,要为特定平台创建可执行文件而进行链接的所有内容,都必须使用该平台对应的同一编译器进行编译。

下图为由 GNU C++ 在汇编语言中生成的经过修饰的函数名称 。

如果函数签名一致,但返回类型不同,会造成编译错误

创建具有相同参数列表但不同返回类型的重载函数会导致编译错误。编译器仅通过参数列表来区分重载函数,这些函数的参数数量不必相同。

如果一个函数省略了默认参数,可能会与另一个重载函数的调用形式完全相同,这也会引发编译错误

例如,若存在一个显式不接受任何参数的函数,以及另一个同名但包含所有默认参数的函数,那么当尝试以不传递任何参数的方式调用该函数名时,就会导致编译错误——编译器无法明确确定应选择哪个版本的函数。

函数模板

函数模板产生的背景
重载函数通常对不同数据类型执行类似的操作。如果对于每种数据类型,程序逻辑和操作都是相同的,那么使用函数模板可以更紧凑、便捷地实现重载。你只需编写一个函数模板定义,C++ 会自动生成独立的函数模板特化版本(也称为模板实例化),以适配所提供参数类型的每种调用类型。因此,单个函数模板定义了一个重载函数家族。使用模板进行编程也称为泛型编程

定义了一个最大值函数模板,该模板返回三个值中的最大值

所有函数模板定义均以template关键字开头,后跟包含在尖括号(<>)中的模板参数列表。

模板参数列表中的每个参数都以关键字typename或keyword class作为前缀。

类型参数是基本类型或用户定义类型的占位符。这些占位符(在本例中为T)用于指定函数参数的类型、函数的返回类型,以及在函数定义体中声明变量。函数模板的定义方式与其他函数类似,但使用类型参数作为实际数据类型的占位符。

头文件maximum.h

// template <关键字 占位符>
template <typename T>  // or template <class T>      
T maximum(T value1, T value2, T value3) {                 T maximumValue{value1}; // assume value1 is maximum    // determine whether value2 is greater than maximumValueif (value2 > maximumValue) {                           maximumValue = value2;                               }                                                        // determine whether value3 is greater than maximumValueif (value3 > maximumValue) {                           maximumValue = value3;                               }                                                        return maximumValue;                                    } 

main.cpp

 // Function template maximum test program.
#include <iostream>
#include "maximum.h" // include definition of function template maximum 
using namespace std;int main() {// demonstrate maximum with int valuescout << "Input three integer values: ";int int1, int2, int3;cin >> int1 >> int2 >> int3;// invoke int version of maximumcout << "The maximum integer value is: "<< maximum(int1, int2, int3);        // demonstrate maximum with double valuescout << "\n\nInput three double values: ";double double1, double2, double3;cin >> double1 >> double2 >> double3;// invoke double version of maximumcout << "The maximum double value is: "<< maximum(double1, double2, double3);// demonstrate maximum with char valuescout << "\n\nInput three characters: ";char char1, char2, char3;cin >> char1 >> char2 >> char3;// invoke char version of maximumcout << "The maximum character value is: "<< maximum(char1, char2, char3) << '\n';} 

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

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

相关文章

NLP学习路线图(四十六):可解释性

在自然语言处理(NLP)技术重塑人机交互、信息检索甚至司法决策的今天,一个尖锐的问题愈发凸显:当模型在文本分类中判定你的贷款申请被拒,或在简历筛选中将你排除,你是否有权追问一句——“为什么?” 一、黑箱迷雾:NLP模型的不透明困境 现代NLP的核心驱动力——深度神经…

uniapp的app项目,在华为pad上运行,页面显示异常

最开始为了好调试&#xff0c;运行成h5在浏览器调试的&#xff0c;调完以后&#xff0c;放到pad上。。。天塌了&#xff0c;所有页面异常&#xff0c;感觉被放大了好多&#xff0c;而且页面很乱。。。 查了很多资料&#xff0c;说把px改为rpx&#xff0c;好&#xff0c;全部改…

Linux中的连接符

Linux中的&&连接符 和其它语言类似&#xff0c;在Shell中&#xff0c;&&是一个逻辑运算符&#xff0c;表示逻辑AND&#xff0c;用于连接多个条件表达式 不同的是&#xff0c;在Linux系统中&#xff0c;&&不仅可以连接条件表达式&#xff0c;而且还能连…

装饰模式Decorator Pattern

模式定义 动态地给对象增加额外的职责 对象结构型模式 模式结构 Component&#xff1a;抽象构件 ConcreteComponent&#xff1a; 具体构件 Decorator&#xff1a;抽象装饰类 ConcreteDecorator&#xff1a; 具体装饰类 抽象装饰类代码 public class Decorator extends Compo…

https说明

http是无状态的&#xff0c;https是在http应用层协议和tcp传输控制层之间加了一层&#xff0c;主要功能包括加密传输内容&#xff0c;校验信息是否完整&#xff0c;信息是否被篡改等。http的网络传输&#xff0c;源端应用层发送http请求&#xff0c;传输到源端的控制层&#xf…

实时操作系统(FreeRTOS、RT-Thread)RISC-V

FreeRTOS&#xff1a;FreeRTOS™ - FreeRTOS™ RT-Thread&#xff1a;rt-thread.org VxWorks&#xff1a; QNX Neutrino RTOS&#xff1a; RT-Linux&#xff1a; 一、 实时操作系统介绍 实时操作系统&#xff08;Real Time Operating System&#xff0c;简称RTOS&#xff…

Python3除标准库外更全面的XML解析方案

一、扩展解析库方案 lxml高性能解析 from lxml import etree doc etree.parse(data.xml) # XPath 2.0增强查询 nodes doc.xpath(//student[score>90]/name/text())优势&#xff1a;支持XPath 2.0语法和XSLT转换&#xff0c;比标准库快5-10倍 BeautifulSoup混合解析 fr…

同时装两个MySQL, 我在MySQL5的基础上, 安装MySQL8

目录 1. 前言 2. 下载MySQL 3. 安装MySQL 3.1 第一步:选择MySQL ​编辑 3.2 第二步:存储地址 3.3 第三步 3.4 第四步:完成基础配置 3.5 第五步 3.6 第六步:数据库密码 3.7 第七部:服务名 4. 环境变量 4.1 复制MySQL的bin地址 4.2 进入高级系统设置 4.3 PATH 4.4 更改…

Visual Studio 2022打包程序流程

Visual Studio 2022打包程序流程 打开管理拓展 安装Microsoft Visual Studio Installer Projects 关闭软件才能继续安装 安装完成后点击&#xff0c;解决方案&#xff0c;创建新项目 添加&#xff1a;setup project 打开软件的路径 复制路径 添加文件 粘贴刚才复制的路径&…

web3方法详解

web3.py 是一个功能强大的 Python 库,用于与以太坊区块链交互。它提供了多种模块和功能,涵盖账户管理、智能合约交互、交易发送、区块链数据查询等。以下是 web3.py 的主要功能模块及其用途: 1. Web3 核心模块 功能:提供基础连接、工具函数和核心功能。 常用方法: Web3(…

HTML5+JS实现一个简单的SVG 贝塞尔曲线可视化设计器,通过几个点移动位置,控制曲线的方向

三次贝塞尔曲线,二次贝塞尔曲线有什么区别 https://blog.csdn.net/xiaoyao961/article/details/148678265 SVG 贝塞尔曲线可视化设计器 下面是一个简单的贝塞尔曲线可视化设计器&#xff0c;使用 HTML5 和 JavaScript 实现。这个设计器允许你通过拖动控制点来实时调整贝塞尔曲…

Pytorch框架——自动微分和反向传播

一、自动微分概念 自动微分&#xff08;Automatic Differentiation&#xff0c;AD&#xff09;是一种利用计算机程序自动计算函数导数的技术&#xff0c;它是机器学习和优化算法中的核心工具&#xff08;如神经网络的梯度下降&#xff09;&#xff0c;通过反向传播计算并更新梯…

【Linux手册】进程的状态:从创建到消亡的“生命百态”

目录 前言 操作系统进程状态 运行状态 阻塞状态 挂起状态 Linux中具体的进程状态 R(running)运行状态 S(sleeping)阻塞状态 D(disk sleep)磁盘休眠状态 T(stopped)和t(tracing stop) X(dead)终止状态 Z(zombie)僵尸状态 僵尸进程的危害 前言 我们在运行可执行程序…

李沐--动手学深度学习 LSTM

1.从零开始实现LSTM #从零开始实现长短期记忆网络 import torch from torch import nn from d2l import torch as d2l#加载时光机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定义和初始化模型参数&#xff…

面经的疑难杂症

1.介绍一下虚拟地址&#xff0c;虚拟地址是怎么映射到物理地址的&#xff1f; 虚拟地址是指在采用虚拟存储管理的操作系统中&#xff0c;进程访问内存时所使用的地址。每个进程都有独立的虚拟地址空间&#xff0c;虚拟地址通过操作系统和硬件&#xff08;如MMU&#xff0c;内存…

去噪扩散概率模型(DDPM)全解:从数学基础到实现细节

一、 概述 在这篇博客文章中&#xff0c;我们将深入探讨去噪扩散概率模型&#xff08;也被称为 DDPMs&#xff0c;扩散模型&#xff0c;基于得分的生成模型&#xff0c;或简称为自动编码器&#xff09;&#xff0c;这可以说是AIGC最近几年飞速发展的基石&#xff0c;如果你想做…

【系统分析师】2011年真题:案例分析-答案及详解

文章目录 试题1【问题 1】【问题 2】【问题 3】 试题2【问题 1】【问题 2】【问题 3】 试题3【问题 1】【问题 2】【问题 3】 试题4【问题 1】【问题 2】【问题 3】 试题5【问题 1】【问题 2】【问题 3】 试题1 随着宽带应用快速发展&#xff0c;用户要求系统服务提供商提供基…

【unitrix】 1.7 规范化常量类型结构(standardization.rs)

一、源码 这段代码实现了一个二进制数字标准化系统&#xff0c;用于将二进制数字类型&#xff08;B0/B1&#xff09;转换为更简洁的表示形式。 //! 二进制数字标准化模块 / Binary Number Normalization Module //! //! 提供将二进制数字(B0/B1)标准化为更简洁表示形式的功能…

NJet Portal 应用门户管理介绍

nginx向云原生演进&#xff0c;All in OpenNJet&#xff01; 1. 应用门户简介 NJet 应用引擎是基于 Nginx 的面向互联网和云原生应用提供的运行时组态服务程序&#xff0c;作为底层引擎&#xff0c;NJet 实现了NGINX 云原生功能增强、安全加固和代码重构&#xff0c;利用动态加…

uni-app学习笔记三十六--分段式选项卡组件的使用

先来看效果&#xff1a; 上图有3个选项卡&#xff08;PS:uniapp官方称之为分段器&#xff0c;我还是习惯叫选项卡&#xff09;&#xff0c;需要实现点击不同的选项卡时下方切换显示对应的数据。 下面介绍下实现的过程。 1.在uniapp官方文档下载并安装该扩展组件&#xff1a;u…