首页 > 编程语言 >C++函数重载、默认形参

C++函数重载、默认形参

时间:2023-08-23 09:00:10浏览次数:34  
标签:调用 函数 形参 默认 编译器 C++ 重载

一、函数重载

1、什么是函数重载?

在同一作用域下,函数名相同,参数列表不同的函数构成重载关系

函数重载与返回值类型、参数名无关

与作用域是否相同,以及参数列表的数量、参数类型、常属性不同等有关

2、C++是如何实现函数重载的?

通过g++ -S 生成汇编代码可知,编译器会把函数的参数类型进行缩写后追加到函数名的末尾形成新的函数名,既是进行了换名操作,从而确保编译结果函数名不重复

3、extern "C"

因为通过C++编译器编译函数、调用语句时,会变成换名后的名字,但是项目中有可能需要去调用已经通过C编译器编译好的函数,它们是没有换名的,因此会调用失败

因为大部分情况下C编译好的文件无法重新使用C++编译器编译,所以只能想办法让C++编译器在调用C编译的函数时不要换名

通过 extern "C"{xxx} 让C++编译器按照C语言的格式编译函数,从而让调用语句与被调用函数名同名,这样就可以正确地调用C标准库、系统函数

4、重载和隐藏

在同一作用域下,函数名相同,参数列表不同的函数构成重载关系

在不同作用域下,同名函数构成了隐藏

5、参数类型不匹配

当调用函数时,编译器会优先调用类型最匹配最精确的版本函数,如果没有最正确的,则会先做类型转换后再匹配,但如果没有能够进行类型转换匹配的版本最后也会报错

但是不建议通过类型转换去调用函数,因为转换情况与编译器有关

二、默认形参

1、什么是默认形参

在C++中可以给函数的参数设置默认值,当函数被调用时如果调用者提供了实参则使用实参调用,如果没有提供则使用默认值调用

2、默认形参要靠右

如果函数有多个参数,并设置了默认形参,要遵循从右往左依次设置默认形参

3、只能在函数声明中设置默认形参

如果函数声明与定义分开实现,只能在函数声明中设置默认形参,否则语法错误

4、默认形参可能会影响函数重载

如果对函数进行了重载,又设置了默认形参,调用时可能会有冲突和歧义,调用失败

因此对于重载过的函数设置默认形参时一定要谨慎

标签:调用,函数,形参,默认,编译器,C++,重载
From: https://www.cnblogs.com/ljf-0804/p/17650124.html

相关文章

  • C与C++的区别
    一、函数重载1、什么是函数重载?在同一作用域下,函数名相同,参数列表不同的函数构成重载关系函数重载与返回值类型、参数名无关与作用域是否相同,以及参数列表的数量、参数类型、常属性不同等有关2、C++是如何实现函数重载的?通过g++-S生成汇编代码可知,编译器会把函数......
  • C++学习day01
    C++学习day01一、C++介绍本贾尼.斯特劳斯特卢普,于1979年在贝尔实验室负责分析UNIX系统内核流量的分布情况时,特别希望有一种更加模块化的工具,于1979.10开始着手研发一款新的编程语言,在C语言的基础上增加了面向对象的机制,也就是C++,1983年完成了C++的第一个版本C++与C的关联和重要......
  • 标准C++ -- day02
    一、函数重载什么是函数重载在同一作用域下,函数名相同,参数列表不同的函数构成重载关系函数重载与返回值类型、参数名无关与作用域是否相同,以及参数列表的数量、参数类型、常属性不同等有关#include<iostream>usingnamespacestd;voidfunc(intnum){cout<<"i......
  • C++基础-STL queue
    queue队列1、特性在一端插入元素,在一端取出元素,具有先进先出的特点,插入和删除都较快。2、适用情况需要一个先进先出结构时使用。3、头文件#include<queue>4、复杂度插入:push(),O(1)删除:pop(),O(1)查找(队列头):front(),O(1)5、定义及常用函数//默认为用deque容器实现的queue;queue<int......
  • Windows中通过C++添加防火墙规则
    #include<iostream>#include<Windows.h>#include<netfw.h>intmain(){ HRESULThr=CoInitializeEx(0,COINIT_APARTMENTTHREADED);//初始化COM if(SUCCEEDED(hr)){ INetFwPolicy2*pFwPolicy2=NULL; //创建防火墙策略 hr=CoCreateInstance(......
  • C++11 lambda函数
    在数理逻辑或计算机科学领域中lambda是被用来表示一种匿名函数,这种匿名函数代表了一种所谓的λ演算(lambdacalculus)。intmain(){intgirls=3,boys=4;autototalChild=[](intx,inty)->int{returnx+y;};returntotalChild(girls,boys);}该函数接受两个参数......
  • C++ 面向对象开发2
    staticstatic函数没有thispointer,static数据只有一份,static函数只能处理static数据。static数据在class外需要提供定义。单例设计classA{public:staticA&getInstance();setup(){...}private:A();;A(constA&rhs);...};A&A::getInst......
  • C++ 面向对象开发1
    ObjectBased:面对的是单一class的设计;ObjectOriented:面对的是多重classes的设计,classes和classes之间的关系。class前向声明,声明,定义。函数若在classbody中定义完成,便自动成为inline函数。如果函数太复杂就不会成为inline。overload的函数编译之后签名不同。虽然参数列表不......
  • 【转载】Macbook M1/M2如何调试c++代码?使用lldb即可
    转载自:https://www.zybuluo.com/qidiandasheng/note/349994#:~:text=GDB%3A,C%2B%2B或者Python插件。MacbookM1/M2无法安装gdb,但是可以使用lldb进行代码调试。使用方法和介绍如下:......
  • C++ 函数模版 不定参数
    实现参数不固定的加法,需要如下实现template<typenameT>TtempSum(constT&t){ staticTsum; sum+=t; returnsum;}//这里保存计算结果template<typenameT>TsaveValue(constT&t){ staticTtemp=t;//这里必须用static的功能 returntemp;}voidt......