当前位置: 首页 > news >正文

使用默认参数的4大要点

概述

        默认参数是C++中新增的特性。在C++中,可以为函数的参数指定默认值。调用函数时,如果没有指定实参,则自动使用默认参数。默认参数的基本语法这里就不作介绍了,下面重点介绍使用默认参数的一些知识要点。

基本规则

        1、当函数中某个形参有默认值时,该形参右边的所有形参都必须有默认值。在下面的示例代码中,形参a有默认值,但右边的形参b没有默认值,这是不合法的,会报编译错误。

int Add(int a = 5, int b, int c = 6);

        2、只能在函数声明和函数定义其中一处给形参指定默认值,不能在两处同时指定,通常在函数声明时指定。比如,下面的示例代码就是不正确的。

// 函数定义和声明时,不同同时指定默认参数值,否则,编译出错
int Add(int a = 5, int b = 6);int Add(int a = 5, int b = 6)
{return a + b;
}

        修改后的代码如下:

int Add(int a = 5, int b = 6);int Add(int a /* = 5 */, int b /* = 6 */)
{return a + b;
}

        3、形参的默认值可以是常量、常量表达式、全局变量和函数指针,但不能是局部变量。因为默认值一般在编译期就会确定下来,而局部变量需要到运行时才能确定其值。

typedef int (*CALLBACK_TEST)(const char *pszText);static int s_nData = 1;int Test(const char *pszText);int Add(int a = 66, int b = 88 + 99, int c = s_nData, CALLBACK_TEST d = Test);

默认参数与占位参数

        占位参数是指参数只声明了类型,没有声明名称。由于没有指定参数名,在函数内部无法使用占位参数,但调用函数时,却必须给占位参数指定实参。占位参数可以与默认参数结合起来使用,此时可以不传实参,主要用于程序扩展和对C代码的兼容。示例代码如下:

int Test(int a, int = 88)
{return a;
}Test(1);
Test(1, 2);

默认参数与函数重载

        在重载的多个函数中,如果有的函数指定了默认参数,则很容易发生二义性的问题,导致编译器无法确定到底使用哪个重载函数,进而发生编译错误。可参看下面的示例代码。

class CBase
{
public:void Show(int a){printf("CBase Show: %d\n", a);}void Show(int a, int b = 88){printf("CBase Show: %d, %d\n", a, b);}
};CBase base;
base.Show(66);        // 产生二义性,编译报错

        可以看到,调用base对象的函数Show(66)时,编译器不知道该调用哪一个重载版本的函数,因为两个版本都能匹配上,故编译器会报错。解决该问题的最佳方案为:尽量不要在函数重载时指定默认参数。

默认参数与虚函数

        在有派生关系的类中,如果基类和派生类的虚函数中都指定了默认参数,且默认参数的值不一致,则会出现一些不符合用户预期的结果。具体可参看下面的示例代码。

class CBase
{
public:virtual void Show(int a = 66){printf("CBase Show: %d\n", a);}
};class CDerived : public CBase
{
public:virtual void Show(int a = 88){printf("CDerived Show: %d\n", a);}
};CDerived *pDerived = new CDerived();
pDerived->Show();            // 输出为CDerived Show: 88
CBase *pBase = pDerived;
pBase->Show();               // 输出为CDerived Show: 66

        可以看到,调用函数时发生了多态行为,均调用了派生类的Show函数,但输出值不一样,为什么会这样呢?我们知道,虚函数具有多态行为,是动态绑定的,但函数的默认参数却是在编译时就静态绑定的。使用派生类的指针调用函数时,绑定的是派生类中声明的函数的默认参数。使用基类的指针调用函数时,绑定的是基类中声明的函数的默认参数。

相关文章:

使用默认参数的4大要点

概述 默认参数是C中新增的特性。在C中,可以为函数的参数指定默认值。调用函数时,如果没有指定实参,则自动使用默认参数。默认参数的基本语法这里就不作介绍了,下面重点介绍使用默认参数的一些知识要点。 基本规则 1、当函数中某个…...

Linux文件系统中的硬链接及常见面试题

如果能对inode的概念有所了解,对理解本文会有所帮助。如果对inode的概念不太清楚也没有关系,我们会捎带介绍一下。在文件系统的实现层面,我们可以认为包含两个组件:一个是包含数据块的池子,池子中的数据块是等大小的&a…...

opencv-StereoBM算法

原理解释目前立体匹配算法是计算机视觉中的一个难点和热点,算法很多,但是一般的步骤是:A、匹配代价计算匹配代价计算是整个立体匹配算法的基础,实际是对不同视差下进行灰度相似性测量。常见的方法有灰度差的平方SD(squ…...

图像分类竞赛进阶技能:OpenAI-CLIP使用范例

OpenAI-CLIP 官方介绍 尽管深度学习已经彻底改变了计算机视觉,但目前的方法存在几个主要问题:典型的视觉数据集是劳动密集型的,创建成本高,同时只教授一组狭窄的视觉概念;标准视觉模型擅长于一项任务且仅擅长于一项任务,并且需要大…...

Metasploit框架基础(一)

文章目录前言一、基础认知二、批量POC/EXP的构想三、poc检测框架的简单实现四、xray五、Meatsploit框架参考前言 Metasploit 一款渗透测试框架漏洞利用的集合与构建和定制满足你的需求的基础漏洞利用和验证的工具 这几个说法都是百度或者官方文档中出现的手法,说…...

pytorch零基础实现语义分割项目(二)——标签转换与数据加载

数据转换与加载项目列表前言标签转换RGB标签到类别标签映射RGB标签转换成类别标签数据数据加载随机裁剪数据加载项目列表 语义分割项目(一)——数据概况及预处理 语义分割项目(二)——标签转换与数据加载 语义分割项目&#x…...

python(8.5)--列表习题

目录 一、求输出结果题 二、计算列表元素个数 三、查找是否存在某元素 四、删除某元素 五、如何在列表中插入元素 六、如何从列表中删除重复的元素 七、 如何将列表中的元素按照从小到大的顺序排序 八、从列表中删除重复的元素 九、大到小的顺序排序 一、求输出结…...

rt-thread pwm 多通道

一通道pwm参考 https://blog.csdn.net/yangshengwei230612/article/details/128738351?spm1001.2014.3001.5501 以下主要是多通道与一通道的区别 芯片 stm32f407rgt6 1、配置PWM设备驱动相关宏定义 添加PWM宏定义 #define BSP_USING_PWM8 #define BSP_USING_PWM8_CH1 #d…...

C语言练习 | 初学者经典练习汇总

目录 1、下面代码输出多少,为什么? 2、你要好好学习么? 3、一直写代码, 4、两个数求最大值 5、输入1-5输出工作日,输入6-7输出休息日,其他输入错误 6、写一个输入密码的代码 7、怎么样当输入数字时候…...

华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 卡片组成的最大数字(Python) | 机试题算法思路 华为OD机试 - 网上商城优惠活动(一)(Python) | 机试题算法思路 华为OD机试 - 统计匹配的二元组个数(Python) | 机试题算法思路 华为OD机试 - 找到它(Python) | 机试题算法思路 华为OD机试…...

「6」线性代数(期末复习)

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 第五章 相似矩阵及二次型 &2)方阵的特征值与特征向量 &3&#xff…...

1.1 硬件与micropython固件烧录及自编译固件

1.ESP32硬件和固件 淘宝搜ESP32模块,20-50元都有,自带usb口,即插即用. 固件下载地址:MicroPython - Python for microcontrollers 2.烧录方法 为简化入门难度,建议此处先使用带GUI的开发工具THonny,记得不是给你理发的tony老师. 烧录的入口是: 后期通过脚本一次型生成和烧…...

【MySQL进阶】视图 存储过程 触发器

😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…...

[Linux篇] Linux常见命令和权限

文章目录使用XShell登录Linux1.Linux常用基本命令:1.1 ls(列出当前的目录下都有哪些文件和目录)1.2 cd (change directory 切换目录)1.3 pwd(查看当前目录的绝对路径)1.4 touch(创建文件)1.5 ca…...

29岁从事功能测试被辞,面试2个月都找不到工作吗?

最近一个28岁老同学联系我,因为被公司辞退,找我倾诉,于是写下此文。 他是14年二本毕业,在我的印象里人特别懒,不爱学习,专业不好,毕业前因为都没找到合适工作,直接去创业了&#xf…...

【C#个人错题笔记1】

观前提醒 记录一些我不会或者少见的内容,不一定适合所有人 字符串拼接 int a3,b8; Console.WriteLine(ab);//11 Console.WriteLine("ab");//ab Console.WriteLine(a""b);//38 Console.WriteLine("ab"ab);//ab38 Console.WriteLine…...

基于lambda的mongodb查询插件

需求背景需要一个像mybatis plus 一样的基于lambda, 且面向对象的查询mongo数据的插件。在网上找了很久,没有发现有类似功能的插件。于是自己手写了一个,借助mongoTemplate屏蔽了底层查询语句的实现细节。在此基础上,实现了查询的统一封装。技…...

基于微信小程序的微信社团小程序

文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器…...

GEE学习笔记 七十三:【GEE之Python版教程七】静态展示影像和动态展示影像

我们使用GEE在线编辑可以直接通过在线的网页可以加载展示我们计算的结果,而python版的GEE要展示我们的计算结果可能就比较麻烦。如果有同学看过GEE的python版API中可以找到一个类ee.mapclient,这个类的介绍是它是GEE官方通过Tk写的一个加载展示地图的类。…...

PGLBox全面解决图训练速度、成本、稳定性、复杂算法四大问题!

图神经网络(Graph Neural Network,GNN)是近年来出现的一种利用深度学习直接对图结构数据进行学习的方法,通过在图中的节点和边上制定聚合的策略,GNN能够学习到图结构数据中节点以及边内在规律和更加深层次的语义特征。…...

超详细的 pytest 教程(一)使用入门篇

前言 pytest到目前为止还没有翻译的比较好全面的使用文档,很多英文不太好的小伙伴,在学习时看英文文档还是很吃力。本来去年就计划写pytest详细的使用文档的,由于时间关系一直搁置,直到今天才开始写。本文是第一篇,主…...

二叉树理论基础知识点

二叉树的种类 在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 如图所示: 这…...

【算法基础】堆⭐⭐⭐

一、堆 1. 堆的概念 堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: (1)堆中某个结点的值总是不大于或不小于其父结点的值; (2)堆总是一棵完全二叉树。 将根结点最大的堆叫做最大堆或大根堆,根结点…...

时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测

时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测 目录时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测预测效果基本介绍研究回顾程序设计参考资料预测效果 基本介绍 CNN-SVM预测模型将深度学习模型作为特征学习器,将SVM 支持向量机 作为训练器进行…...

【TypeScrip】TypeScrip的任意类型(Any 类型 和 unknown 顶级类型):

文章目录一、安转依赖:【1】nodejs 环境执行ts【2】使用ts-node二、Any 类型 和 unknown 顶级类型【1】没有强制限定哪种类型,随时切换类型都可以 我们可以对 any 进行任何操作,不需要检查类型【2】声明变量的时候没有指定任意类型默认为any【…...

智能洗地机什么牌子好?智能洗地机排行

要说家庭清洁热门的产品,洗地机肯定首当其冲,集洗吸拖为一体的清洁工具,省时又省力,可谓是家里清洁好助手,今天笔者就为大家介绍几款重量轻、噪音轻、拖地干净的洗地机! 一、CEYEE希亦T800洗地机 在国内,洗…...

【数据结构与算法】链表1:移除链表 设计链表链表反转(双指针法、递归法)

文章目录今日任务1.链表理论基础(1)什么是链表?(2)链表的类型(3)链表的存储方式(4)链表的定义(5)链表的操作(6)性能分析2.…...

山东大学软件学院面向对象简答题整理【个人向】

面向对象简答题整理【个人向】 0.试用面向对象语言简述改写和重定义的异同,以及方法绑定时的差别 改写是子类的方法和父类的方法具有相同的方法名和类型签名重定义是子类的方法和父类的方法方法名相同但类型签名不同在方法绑定时,改写是动态绑定&#…...

JAVA时间类及JAVA8新时间类

文章目录Java旧时间类关系图![在这里插入图片描述](https://img-blog.csdnimg.cn/e2c2c26c841e40bdb9cc85d0fc4bc1df.png)GMT、时间戳、统一标准时间、时区Java时间类创建时间类示例java.text.DateFormat时间格式转换java.util.Calendar总结Java时间类Java8新时间类InstantCloc…...

ASEMI代理FGH60N60SFD,安森美FGH60N60SFD原装IGBT

编辑-Z 安森美FGH60N60SFD原装IGBT参数: 型号:FGH60N60SFD 集电极到发射极电压(VCES):600V 栅极到发射极电压(VGES):20V 收集器电流(IC):120…...

金华网站建设明细报价表/新网站友链

http://www.cnjm.net/tech/article2049.html 本文版权归原作者&#xff0c;中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net> 来自:http://www.cnjm.net/tech/article2049.html 由于无线设备所能支持的网络协议非常有…...

电商详情做的最好看的网站/seo是什么意思广东话

导读作者&#xff1a;Sveta Smirnova翻译&#xff1a;郑志江校对&#xff1a;徐晨亮原文 &#xff1a;MySQL Memory Management, Memory Allocators and Operating System本文涉及链接在文末展示When users experience memory usage issues with any software, including MySQL…...

b站免费试用装扮/广西壮族自治区在线seo关键词排名优化

使用<crtdbg.h>的接口来定位内存泄漏问题&#xff0c;请注意只能在Debug下进行调试&#xff0c;主要有如下接口&#xff1a; _CrtDumpMemoryLeaks();//打印所有内存泄漏信息 _CrtMemDifference(&s3, &s1, &s2)//判断检监测点1和监测点2是否不同 _CrtMemDumpS…...

wordpress 内存清理/网站怎么开发

Unity 之 关于UnityHub无法打开项目的问题&#xff08;弹出Unity启动界面有退回到Hub选择工程界面&#xff09;方案一&#xff1a;万能的重启大法方案二&#xff1a;未开启许可证方案三&#xff1a;终极奥义 -- 弃用Hub&#xff08;只支持2018之前的版本&#xff09;Unity Hub …...

有用织梦做的大网站吗/专门用来查找网址的网站

作者&#xff1a;Natasha The Robot&#xff0c;原文链接&#xff0c;原文日期&#xff1a;2016-07-25译者&#xff1a;Lanford3_3&#xff1b;校对&#xff1a;千叶知风&#xff1b;定稿&#xff1a;CMB上周我出席了 iOSDevCampDC&#xff0c;并有幸参加了 ayanonagon 关于测试…...

企业网站建设费如何列支/网络推广怎么找客户

这是悦乐书的第306次更新&#xff0c;第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题&#xff08;顺位题号是733&#xff09;。图像由二维整数数组表示&#xff0c;每个整数表示图像的像素值&#xff08;从0到65535&#xff09;。给定表示泛洪填充的…...