重新思考C++函数重载

C++运算符重载 C++运算符重载,深度解析 阅读详情

函数调用

在C++中,辨别一个函数的方法依次为:作用域→函数名→函数参数,编译器根据这三步来决定调用哪个函数,所以当这三者都无法让编译器决定调用哪个函数时,编译就会出错。如下面这段代码,两个f函数有着相同的作用域和函数名,对f传入一个右值,既能匹配值传递的函数,又能匹配右值引用,所以编译就会报错。

#include <iostream>
using namespace std;

void f(int a) {
    cout << "" << endl;
}

void f(int&& a) {
    cout << "&" << endl;
}

int main()
{
    f(1);
    return 0;
}

当编译器能通过这三种方法决定调用哪个函数时,便可正常编译,如将上述代码中对f的调用改为如下:

int a = 1;
f(a);

编译运行正常,因为当传入一个左值时,该参数只能匹配到值传递的f函数。

函数重载

从函数调用的角度上,我认为可以这样理解函数重载:对于两个及以上的函数,编译器必须通过函数参数这最后一步将他们区分,且至少存在一种情况编译器能够区分他们,则这些函数构成重载。

从这个角度上看,函数重载需要满足以下条件:

  • 在同一作用域内
  • 函数名相同
  • 存在编译器能够区分不同函数的情况

所以,第一段代码在调用时虽然会报错,但仍然构成重载,因为存在第二段代码所示的情况能够区分他们。

相反,下面这段代码不构成重载,因为无论何种情况,编译器都无法决定应该调用哪个函数:

void f(int a) {
    cout << "" << endl;
}

void f(const int a) {
    cout << "const" << endl;
}

而这段代码又构成重载,因为在传入右值时编译器只能匹配第二个f,并且当传入左值引用/常左值引用时编译器也能知道应该调用哪个函数:

void f(int& a) {
    cout << "&" << endl;
}

void f(const int& a) {
    cout << "const&" << endl;
}

同理,下面这段代码同样可以构成重载:

void f(int* a) {
    cout << "*" << endl;
}

void f(const int* a) {
    cout << "const*" << endl;
}

对于类成员函数,同样可以采用这种思路进行理解。

例如,对于成员函数和常成员函数,即便他们有相同的参数列表,他们也可以构成重载,因为编译器能够在调用的时候区分他们。

class A {
public:
    void f(int a) {
        cout << "A::f(int)" << endl;
    }
    void f(int a) const {
        cout << "A::f(int) const" << endl;
    }
};

int main()
{
    const A a;
    a.f(1);
    return 0;
}

普通成员函数可以看做增加了一个this指针作为第一个参数的成员函数,而常成员函数的这个this指针是带const的,所以也会导致参数列表不同。

但是相反,具有相同参数列表的静态成员函数和非静态成员函数却不能构成重载,例如以下代码编译便会报错:

class A {
public:
    static void f(int a);
    void f(int a) {
        cout << "A::f(int)" << endl;
    }
};

void A::f(int a) {
    cout << "static A::f(int)" << endl;
}

原因是静态成员函数既可以通过类调用,也可以通过对象来进行调用,这就导致了当使用对象调用静态成员函数时,若存在有着相同参数列表的非静态成员函数,编译器便无法决定应该调用哪一个,也就是仅仅凭借static无法作为重载他们的依据,但这样换来的好处是——可以重载具有不同参数列表的静态和非静态成员函数。

这样解释就感觉容易理解多了^_^

补充

有一段话写的非常好,函数名的作用是对函数的功能进行提示,而参数列表的功能是对函数的用法进行提示,重载的作用是扩展原有的功能。重载并非必须,而更多的是为了符合人们的使用习惯,为了方便。

c++运算符重载 1概念 什么是运算符重载 所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的函数,也就是”一名多用”。 运算符也可以重载。实际上,我们已经在不知不觉之中使用了运算符重载。例如,大 家都已习惯于用加法运算符”+”对整数、单精度数和双精度数进行加法运算,如5+8, 5.8 +3.67等,其实计算机对整数、单精度数和双精度数的加法操作过程是很不相同的, 但由于C++已经对运算符”+”进行了重载,所以就能适用于int, float, 阅读详情

相关推荐

Python环境搭建和LabVIEW中的调用

本文主要介绍Python相关的环境搭建、Anaconda的使用以及在LabVIEW中调用Python的方法。

lvxisi的博客 6390

C++参数传递

每次函数调用时都会重新创建它的形参,并用传入的实参对形参进行初始化。一、三种传递方式 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。 指针传递: 形参为指向实参地址的指针,当对形参的指针操作时,就相当于对实参本身进行的操作。指针传递

hjhomw的博客 740

实战解析:如何通过LTspice仿真优化MOS管缓启动电路,解决上电冲击电流问题

本文详细解析如何通过LTspice仿真优化MOS管缓启动电路,有效解决上电冲击电流问题。文章从问题根源分析入手,介绍LTspice环境搭建、缓启动电路设计原理、参数优化技巧及实际工程问题排查,帮助工程师掌握MOS管电源开关电路的关键设计方法,提升系统可靠性和性能。

weixin_28683689的博客 516

C++分别调用不同头文件的相同函数

最近在学习数据结构自定义了两个头文件,里面都有相同的函数定义,但是在分别调用时出现错误,也就是只引入一个头文件出现错误。不知道为什么,难道分别引用头文件都很出现错误吗?程序运行平台 VS 2022。

weixin_53493295的博客 785

STM32G0——USB虚拟串口

STM32G0用cubeMX配置实现USB虚拟串口

阿昌 2321

用UltraISO制作镜像以RAW格式刻录系统到U盘后,在Windows上无法识别的解决办法

在这篇文章中,用UltraISO制作镜像后,会使得U盘无法识别!!!那么,如何抹掉U盘的数据,格式化U盘呢?

拥抱具身智能,昇腾Ascend C 2730

C++【函数重载】解析

函数重载

m0_72371030的博客 675

Python爬虫实战:爬取Bilibili和YouTube视频、弹幕和评论

随着视频内容平台的爆发式增长,视频网站成为了人们获取信息、娱乐和知识的重要渠道。在这些平台上,视频、弹幕和评论数据可以为我们提供重要的信息,帮助我们了解用户的行为、视频的受欢迎程度以及内容的互动情况。本篇文章将带你实现一个Python爬虫,用来爬取Bilibili和YouTube上的视频、弹幕、评论等数据。我们将详细介绍爬虫的实现过程,使用最新的Python技术,并且会提供完整的代码。Bilibili网站提供了多种方式来获取视频数据,最直接的方式是通过其开放的API接口来获取视频、弹幕和评论等数据。

2201_76125261的博客 1775

C++ 函数的重载 详解

在有的情境下我们需要实现几个功能相似的函数,可能只有细节上有区别。比如求两个数的和,这两个数有多重类型,可能是int,float,double,char,bool等。如果在C语言中我们往往需要设计多个不同名称的函数。例如: int Add1(int a, int b); //求两个int类型的数之和 float Add2(float a, float b); //求两个float类...

yulong__li的博客 4892

详细解释xilinx源语的使用:IDELAYE2和IDELAYE3

/ 完整的数据位对齐模块input wire dqs, // 数据选通input wire [7:0] dq_in, // 8位数据输入output wire [63:0] data_out // 并行数据输出// 延迟控制信号// 每个数据位都需要独立的IDELAYgenvar i;i < 8;// IDELAYE2实例.IDELAY_VALUE (10), // 初始值。

baidu_34971492的博客 436

人工蜂群优化算法(ABC)详解:原理、实现与应用

人工蜂群算法(Artificial Bee Colony, ABC)是Karaboga于2005年提出的一种群体智能优化算法,其灵感来源于蜜蜂群体在自然界中高效的采蜜行为。该算法通过模拟雇佣蜂、观察蜂和侦察蜂三种角色的分工协作来寻找最优解。在ABC算法中,每个潜在的解决方案被视为一个“食物源”,其质量由适应度函数评估。雇佣蜂负责在已知优质食物源附近进行局部开采;观察蜂根据雇佣蜂分享的信息,以一定概率选择并跟进优质食物源;侦察蜂则随机探索新区域,防止种群陷入局部最优。

qq_42212808的博客 393

C++派生类为什么不能重载基类的函数

<br />之前在社区里的C++语言论坛问了一个问题,<br />http://topic.youkuaiyun.com/u/20100520/16/5c0e208e-27a0-4ad8-af55-ca6e8913db5a.html<br />问题就是“派生类为什么不能重载基类的函数?”,下面看一段简单的C++代码:<br /> <br />class A { public: void function(); }; void A::function() { cout<<"A funct

adamwyb的专栏 2443

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

安装这个软件之前先安装VisualStudio,本文安装这个软件时已经安装了VisualStudio2019。1、下载倍福PLC编程软件TwinCAT。

qq_34059233的博客 3664

C++中重载构造函数的互相调用初始化成员变量的问题

文章目录C++中重载构造函数的互相调用初始化成员变量的问题不能直接互相调用的重载构造函数使用一个private的函数初始化成员变量使用带有默认参数的构造函数使用placement new运算符调用重载构造函数使用C++11的委托构造函数(在初始化列表位置调用) C++中重载构造函数的互相调用初始化成员变量的问题 写一个类的时候,我们可能会希望有多重不同的初始化方式,此时就用到了重载构造函数。例如:...

uniooo的专栏 3597

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++-函数:函数重载【同一个作用域、参数个数不同、参数类型不同、参数顺序不同】【实现原理:编译器根据不同的参数类型来重新修改原函数名得到不同的重载函数名】

能使名字方便使用,是任何程序设计语言的一个重要特征!我们现实生活中经常会碰到一些字在不同的场景下具有不同的意思,比如汉语中的多音字“重”。当我们说: “他好重啊,我都背不动!”我们根据上下文意思,知道“重”在此时此地表示重量的意思。如果我们说“你怎么写了那么多重复的代码?维护性太差了!”这个地方我们知道,“重”表示重复的意思。同样一个字在不同的场景下具有不同的含义。那么在c++中也有一种类似的现象出现,同一个函数名在不同场景下可以具有不同的含义。

u013250861的博客 955

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

c++函数重载及其实现原理

c++函数重载及其实现原理

芮萌萌的博客 846

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++中的函数重载、函数重写、函数重定义 2021-09-02

一、函数重载(Function Overloading) 为了更加深刻的理解 函数重载、重写、重定义,我们可以带着如下这两个问题去思考: 1、子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类的命名空间不同; 2、子类中定义的函数是否可以重载父类中的同名函数? 不可以,因为函数重载必须在同一个作用域中。    1、什么是函数重载   在同一个类中(同一个作用域中/在类的内部),存在一组函数名相同,函数的参数列表不同(参数的个数、类型、顺序),函数有无 virtual 关键字都可以,我们把这组

qinjie的博客 1007

【C++】:C++函数重载的映射机制(内容较深)

——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘 写在前面: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题 1、声明/定义重载函数时,是如何解决命名冲突的?(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了

阳光心态,健康人生的博客 566

【C++】C++入门(下):函数重载,引用,inline,nullptr

C++入门——函数重载,引用,inline与nullptr

2502_94043640的博客 784

C++学习_函数重载和默认参数

C++ 学习_函数重载和默认参数 我为什么要写C++系列博文呢?理由很蛋疼,因为C++的语法太庞杂了,从目前来看,后面我很难有精力和能力来总结一篇令我满意的”C++语法汇总”,所以干脆放弃那样做,将我学习的过程记录下来,这样写出来的东西包含的知识也比较全面。不过,由于我是学习的过程,所以在文章中难免有一些错误或者疏漏之处,希望大家不嫌麻烦的可以指出我的错误,本人会在第一时间修正该系列内容!...

冷山不生云 560

C++运算符重载技术

前言:C++语言给使用提供重载机制,大大提高的使用的灵活性。 1 函数重载概念 1 函数重载概念 函数重载(Function Overload) 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同 函数重载的判断标准 参数个数不同 参数类型不同 参数顺序不同 注意: 不能把返回值作为函数重载的条件,原因是编译器在编译时不会去判断函数的返回类型,函数只有调用后,编译器才会...

Kroner的博客 479

C++核心编程——详解运算符重载

C++的一大特性就是重载,重载使得程序更加简洁高效。在C++中不只函数可以重载,运算符也可以重载,运算符重载主要是面向对象之间的。运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载语法: 在C++中,使用operator关键字定义运算符重载。运算符重载语法格式如下: 函数的参数列表中参数个数取决于两个因素。通过案例两个对象相加演示“+”运算符的重载: 通过上面案例可以知道,重载运算符并没有改变其原来的功能,只是增加了针对自定义数据类型的运算功能,具有了更广泛的

阿标de杂货铺 1594

【C++】C++中的运算符重载

*受到cout输出的原理启发,直接打印(输出)结构体,自定义的类对象(猫)*/class Catpublic:name=_name;age=_age;//缺陷:无法连续打印//可以连续打印private:int age;//void operator<<(ostream &out,Cat &other) //缺陷:无法连续打印ostream &operator<<(ostream &out,Cat &other) //可以连续打印。

qq_62917398的博客 943

【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

const 成员函数和初始化列表你了解嘛?今天就带你重新认识一下C++的构造函数让你感受祖师爷的高明之处!

鸽芷咕的博客 1万+

C++函数重载:从语法糖到重载决议的深度解析与实战指南

函数重载是C++中实现静态多态的核心机制,它允许在同一作用域内定义多个同名函数,通过参数列表的差异来区分。其底层原理依赖于编译器的名字修饰技术,将参数类型信息编码到函数名中,从而在链接阶段实现唯一标识。这一特性极大地提升了代码的可读性和接口的简洁性,是构建类型安全、表达力强的API的重要基础。在工程实践中,函数重载与重载决议机制紧密相关,编译器需要根据实参类型从候选函数集中选择最佳匹配,这涉及到精确匹配、类型提升和标准转换等复杂规则。理解这些规则对于避免模糊调用错误、设计清晰的类接口至关重要。特别是在现代C

weixin_34357436的博客 428

C++函数重载:从原理到实战,掌握静态多态核心机制

函数重载是C++实现静态多态的核心机制,它允许在同一作用域内定义多个同名函数,通过参数列表(类型、个数或顺序)的差异进行区分。其底层原理依赖于编译器的名字修饰技术,即在编译阶段对函数名进行改编,融入参数类型等信息以生成唯一符号。这一机制在工程实践中极大提升了API的清晰度与灵活性,使代码更符合直觉,例如统一使用`add`函数处理不同类型或数量的参数,而无需记忆多个特定名称的函数。理解重载决议的优先级规则(如精确匹配、类型提升)及常见陷阱(如默认参数引发的歧义),是编写健壮C++代码的关键。对于C++初学者而

virusswb的专栏 344
上一篇: Games202作业1
下一篇: 解析Lua函数
要什么单车
博客等级 码龄8年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值