C++:深入剖析默认参数

看下列代码执行结果,你猜一猜会输出什么?

#include<iostream>
using namespace std;
struct A {
	virtual void fun(int a = 10) {
		cout << "A,a="<<a;
	}
};
struct B :public A {
	void fun(int a = 5) {
		cout <<"B,a="<<a;
	}
};
int main() {
	A* a = new B;
	a->fun();
}

我们看运行结果:

在这里插入图片描述
通过运行结果可以得知发生了多态但是默认参数的值是父类中的。

汇编中默认参数只会在传参中体现为一个字面量所以看编译的中间代码

int main ()
{
  void * D.53827;
  struct A * a;
  int D.53825;
  bool D.49666;
  void * D.49598;
  int (*) () * _1;
  int (*) () _2;
  void * _5;
  void * _6;
  bool _7;
  bool _9;
  int _12;

  <bb 2> :
  _5 = operator new (8);
  _6 = _5;
  _7 = 1;
  B::B (_6);
  _9 = 0;
  a_10 = _6;
  _1 = a_10->_vptr.A;
  _2 = *_1;
  OBJ_TYPE_REF(_2;(struct A)a_10->0B) (a_10, 10);
  _12 = 0;

  <bb 3> :
<L0>:
  return _12;

}


void B::B (struct B * const this)
{
  struct A * _1;
  int (*) () * _2;

  <bb 2> :
  _1 = &this_3(D)->D.49586;
  A::A (_1);
  _2 = &_ZTV1B + 16;
  this_3(D)->D.49586._vptr.A = _2;
  return;

}


void A::A (struct A * const this)
{
  int (*) () * _1;

  <bb 2> :
  _1 = &_ZTV1A + 16;
  this_3(D)->_vptr.A = _1;
  return;

}


void B::fun (struct B * const this, int a)
{
  struct basic_ostream & D.53828;
  struct basic_ostream & _1;
  struct basic_ostream & _4;

  <bb 2> :
  _4 = std::operator<< <std::char_traits<char> > (&cout, "B,a=");
  _1 = _4;
  std::basic_ostream<char>::operator<< (_1, a_5(D));
  return;

}


void A::fun (struct A * const this, int a)
{
  struct basic_ostream & D.53829;
  struct basic_ostream & _1;
  struct basic_ostream & _4;

  <bb 2> :
  _4 = std::operator<< <std::char_traits<char> > (&cout, "A,a=");
  _1 = _4;
  std::basic_ostream<char>::operator<< (_1, a_5(D));
  return;

}

可以看出默认参数在编译时遇到函数调用直接获取了字面量,那么它的生效时间是先于动态多态的,这个时期无论默认参数的字面量存储在代码区还是静态区都不会影响选择,因为这个阶段并没有发生多态也就无从改变默认参数的使用,可以说默认参数就是在编译时期确认函数参数的一种静态行为。

同时这并不是说函数参数是静态的,至少C/C++中函数参数只能是局部的栈区变量(用static声明也会失效),或者可以简单的理解为一种标识符,标识函数调用时传参的要求或者说唯一标识一个函数。

下面一个例子可以证明函数参数不存在static的说法。

#include<iostream>
using namespace std;
struct Test
{
	int a;
};
struct A {
	Test& fun1(Test ptr = { 6 }) {
		return ptr;
	}
	Test& fun2(Test ptr) {
		return ptr;
	}
	Test& fun3(static Test ptr) {
		return ptr;
	}
	Test& fun4(static Test ptr = {6}) {
		return ptr;
	}
	Test& fun5() {
		static Test ptr{ 6 };
		return ptr;
	}
};

int main() {
	A a;
	Test t{ 6 };
	Test*cur1=&a.fun1();
	Test*cur2= &a.fun2(t);
	Test*cur3 = &a.fun3(t);
	Test*cur4 = &a.fun4();
	Test*cur5 = &a.fun5();
	cout << cur1->a << " " << cur2->a << " " << cur3->a << " " << cur4->a<<" "<<cur5->a<<endl;
}

根据返回值可以得出结论static并没有成功修饰到形参,这个其实可以从两方面理解。

  1. 函数形参并没有静态类型的需求。
  2. static修饰词就是那样定义的,详情看这篇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初入外贸行业,拓展客户怎么做?这篇文章教会您

作为外贸小白&#xff0c;您是否为找不到合适的客户而苦恼&#xff1f;您是否想要拥有更多的订单和收入&#xff1f;如果您的答案是肯定的&#xff0c;那么您就需要学会如何通过CRM系统拓展目标客户。下面来说说&#xff0c;外贸小白怎么扩展目标客户&#xff1f; 1、搜集客户…

建议收藏!操作系统基础:文件系统实现【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f3c6;&#x1f3c6;本文完整PDF源文件请翻阅至文章底部下载。&#x1f3c6;&#x1f3c6; ⚔️1 文件系统的层次结构&#x1f527;1.1 总览&#x1f527;1.2 例子…

《动手学深度学习(PyTorch版)》笔记7.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

25.云原生ArgoCD高级之app of apps模式

文章目录 app of apps 模式介绍app如何管理apphelm方式管理kustomize方式管理 app of apps 模式介绍 通过一个app来管理其他app&#xff0c;当有多个项目要发布创建多个app比较麻烦&#xff0c;此时可以创建一个管理app&#xff0c;管理app创建后会创建其他app。比较适合项目环…

Windows显示空的可移动磁盘的解决方案

123  大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式…

stack_queue:三个关键注意事项解析

一、stack与容器 template<class T, class Container> class stack { private:Container _con; };Container 为容器&#xff0c;在实例化创建对象时&#xff0c;我们可以传 vector<T> 或 list<T> 等作为栈的底层。 举例&#xff1a; int main() {stack<i…

【css】css国际色标卡卡板-收藏

CSS3 国际标准色卡板 - 踏得网

C++——位图与布隆过滤器

目录 一&#xff0c;位图 1.1 关于大量数据的问题 1.2 位图概念 1.3 位图模拟实现 1.4 位图的应用 1.5 位图优缺点 二&#xff0c;布隆过滤器 2.1 一些场景 2.2 布隆过滤器概念 2.3 布隆过滤器模拟实现和测试 2.4 布隆过滤器查找 2.5 布隆过滤器删除 2.6 布隆过滤器优…

Arduino 串口绘图仪简单使用

1、工具所在位置 串口绘图仪实际上是从预设的串口获取值并将其绘制在xy轴图每获取到一组数据向左滑动一个单位&#xff0c;读取数据的速度起快&#xff0c;滑动就越快。 Y轴代表来自串口的值&#xff0c;可以是单个也可以是一组 。在读取串口数据时遇到"\n"&#xf…

Redis缓存过期淘汰策略详讲

前言 查看redis最大占用内存 1&#xff09;命令查看 config get memory2&#xff09;进入redis配置文件&#xff0c;查看maxmemory vim /myredis/redis.conf3&#xff09;redis默认内存多少可用 如果不设置最大内存大小或者设置最大内存大小为0&#xff0c;在64位操作系统…

【开源】SpringBoot框架开发高校学生管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学生选课模块2.4 成绩管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学院课程表3.2.3 学生选课表3.2.4 学生成绩表 四、系统展示五、核心代码5.1 查询课程5.2 新…

牛客——牛可乐的翻转游戏(状压,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 牛可乐发明了一种新型的翻转游戏&#xff01; 在一个有 nnn 行 mmm 列的棋盘上&#xff0c;每个格子摆放有一枚棋子&#xff0c;每一枚棋子的颜色要么是黑色&#xff0c;要么是白色。…

CentOS 8 安装配置 Hadoop3.3.6 伪分布式安装方式(适用于开发和调试)

1.配置服务器ssh免密登录&#xff0c;否则后面启动会报错&#xff1a;尝试通过SSH连接到主机出现认证错误的提示 配置服务器ssh免密登录&#xff1a; 1.生成SSH密钥对&#xff08;如果尚未生成&#xff09;&#xff1a; 执行下面的命令生成密钥对&#xff0c;一直回车即可 ssh…

Intellij Idea的数据库工具 DataGrip

DataGrip DataGrip&#xff1a; IDEA自带&#xff0c;非常好用。智能提示很强大&#xff0c;快捷键跟IDEA自身一致。 如果下载不了 DataGrip&#xff0c;也可以直接用 IDEA 自带的。 常用的快捷键 alt8&#xff1a; 打开数据库Service ctrlshiftF10&#xff1a;打开常用的数…

记一次CPU有规律飙高的线上问题排查过程

一、背景 最近在计费系统模块和灰度发布相关的功能已经基本交付,在这个间隙中,领导说有个线上问题需要排查下, 问题的场景比较有意思,排查过程中也有一些成长,这里记录一下。 二、排查过程 2.1 查看pinpoint 监控 首先根据领导的反馈看pinpoint中的JVM的CPU日志: CP…

基于Vue2用keydown、setTimeout事件实现连续按键(连击)任意键(或组合键)3秒触发自定义事件(以F1键为例)

核心代码 <template></template> <script> export default {created() {//监听弹起快捷键addEventListener("keyup", this.keyup);},destroyed(d) {//移除监听弹起快捷键removeEventListener("keyup", this.keyup);},methods: {keyup(…

ES节点故障的容错方案

ES节点故障的容错方案 1. es启动加载逻辑1.1 segment和translg组成和分析1.2 es节点启动流程1.3 es集群的初始化和启动过程 2. master高可用2.1 选主逻辑2.1.1 过滤选主的节点列表2.1.2 Bully算法2.1.2 类Raft协议2.1.3 元数据合并 2.2 HA切换 3. 分片高可用3.1 集群分片汇报3.…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

HTTP1.1、HTTP2、HTTP3

HTTP1.1 HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。支持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&…

函数的连续与间断【高数笔记】

【连续】 分类&#xff0c;分几个&#xff1f;每类特点&#xff1f; 连续条件&#xff0c;是同时满足还是只需其一&#xff1f; 【间断】 分类&#xff0c;分几个大类&#xff0c;又分几个小类&#xff1f;每类特点&#xff1f; 间断条件&#xff0c;是同时满足还是只需其一&am…