首页 > 编程语言 >C++默认参数实现原理分析

C++默认参数实现原理分析

时间:2023-11-18 18:46:23浏览次数:47  
标签:int void 默认 编译器 参数 C++ foo

简介定义

C++默认参数指的是当函数调用中省略了实参时自动使用的一个值。写法如下:

void foo(int a = 1)
{
}

void foo(int a, int b=1, int c=1)
{
}

默认参数有两个规则,

  • 规则一:从第一个出现默认参数的参数开始,后面的参数必须也指定默认参数
void foo(int a=1, int b, int c=1); //错误
void foo(int a=1, int b, int c); //错误
void foo(int a, int b, int c=1); //正确
void foo(int a, int b=1, int c=1); //正确
void foo(int a=1, int b=1, int c=1); //正确
  • 规则二:声明和定义分开时,仅声明处做初始赋值动作
void foo(int a = 1);

void foo(int a)
{
}

分析原理

在我的理解中,C++的各种特性基本是靠编译器隐藏了很多特殊操作,来实现这些特性,诸如面向对象等等。实际纯C语言结合一些编译器选项,完全可以实现C++的绝大多数效果。所以直接看汇编,扒开编译器隐藏的细节,到汇编这一层基本原形必露,借助Compiler Explorer:

对比发现有没有默认参数两者汇编一模一样,那为什么可以实现不同的效果呢?再看下如果调用一下这2个函数:

可以看到如果不给默认参数赋值,则在调用处会由编译器自动给参数赋值为默认值,如果你指定了参数值,就用你指定的。也就是说编译器玩了个花招而已,并没多牛逼。

了解了实现原理后,再分析下为什么有上面的两个规则约束。假设带默认参数的函数可以这样定义:

int foo(int a = 1, int c);

按照它的特性,可以在调用处以这几种形式调用:

foo(1);//本意是a使用默认值a=1,c使用传递的值c=1
foo(1);

标签:int,void,默认,编译器,参数,C++,foo
From: https://www.cnblogs.com/thammer/p/17840866.html

相关文章

  • Code-C++-字符串分割
    Code-C++-字符串分割转自【C++中string如何实现字符串分割函数split()——4种方法-CSDNApp】http://t.csdnimg.cn/8iWb7stringstreamgetline()stringfind()substr()ccharstrtok()strtok_r()regex_token_iterator<>getline()voidStringsplit(stringstr,const......
  • c++线程专题
    逐步更新中~~~,参考书籍《C++并发编程实战(第2版)》,不照搬书,只写理解感悟。引入头文件#include<thread>线程启动std::threadt(my_func);若需等待线程执行完毕,才继续之后的代码,用joinif(t.joinable()){t.join();}若不等待,可以分离出去(分离出去的线程被称为守护......
  • C++ Primer学习笔记——第十二章
    第十二章动态内存前言在此之前,我们使用的程序中对象都有着严格定义的生存期:全局对象,在程序启动时分配,在程序结束是销毁。局部自动对象,当进入定义所在程序时创建,在离开块时销毁。局部static对象,在第一次使用前分配,在程序结束时销毁。显然这存在限制,为此C++支持动态分配对......
  • C++ 观察者模式实现
    观察者模式主体(被观察者)通知一个或多个观察者状态改变/数据更新/事件发生。描述C++实现观察者模式有几个要点:观察者都有一个共同的抽象基类Listener,定义了一个纯虚接口OnNotified(),主体调用该接口通知观察者每个观察者ConcreteListener继承自抽象基类Listener,并实现......
  • delphi:传递参数的几种方式(转载)
     原文地址:https://www.delphitop.com/html/chengxu/2732.html一、默认方式以值方式传递参数 procedure TForm1.ProcNormal(Value: string);   begin   OrigNum:=Value+' Me';   lblReturn.Caption:=OrigNum;//OrigNum为'Hello Me'   lblOrig.Caption:=Val......
  • 前端歌谣-第贰拾贰课-函数参数默认值
    前言我是歌谣最好的种树是十年前其次是现在今天继续给大家带来的是this指向的讲解环境配置npminit-yyarnaddvite-D修改page.json配置端口{"name":"demo1","version":"1.0.0","description":"","main":"index.js",......
  • C/C++ 运用VMI接口查询系统信息
    WindowsManagementInstrumentation(WMI)是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口,通过这个接口,可以获取有关计算机系统硬件、操作系统和应用程序的信息,以及对系统进行管理和控制的能力。WMI允许通过编程方式查询系......
  • L1-6 吉老师的回归 (15 分)(C/C++)
    输入样例1:51L1-1isaqiandaoproblem.L1-2isso...easy.L1-3isEasy.L1-4isqianDao.Wow,suchL1-5,soeasy.输出样例1:L1-4isqianDao.输入样例2:54L1-1isa-qiandaoproblem.L1-2issoeasy.L1-3isEasy.L1-4isqianDao.Wow,suchL1-5,so!!easy.输出样例......
  • AO3415-ASEMI低压MOS管AO3415参数、封装、尺寸
    编辑:llAO3415-ASEMI低压MOS管AO3415参数、封装、尺寸型号:AO3415品牌:ASEMI封装:SOT-23连续漏极电流(Id):4A漏源电压(Vdss):20V功率(Pd):1.5W芯片个数:1引脚数量:3类型:MOS管特性:P沟道MOS管、低压MOS管RDS(on):55mΩVGS:1.45封装尺寸:如图工作温度:-55°C~150°CAO3415特性:AO3415采用先进的沟槽......
  • netcore 间隔时长修改参数 示例
    usingSystem;usingSystem.Threading.Tasks;classProgram{privatestaticintyourParameter=0;staticasyncTaskMain(){while(true){//等待5分钟awaitTask.Delay(TimeSpan.FromMinutes(5));//在这......