【C->Cpp】深度解析#由C迈向Cpp(2)

目录

(一)缺省参数

全缺省参数

半缺省参数

 缺省参数只能在函数的声明中出现:

小结:

 (二)函数重载

函数重载的定义

 三种重载


        在上一篇中,我们从第一个Cpp程序为切入,讲解了Cpp的命名空间要解决的问题,以及输入输出流。

        接下来,开始本篇内容->


长长的路,慢慢的走 


(一)缺省参数

 

       缺省参数是Cpp另一个基于C上的新增加的语法,实现一个项目,离不开一个一个的功能,为了更加方便的重复使用同一个功能,我们通常将代码段封装成“高内聚,低耦合”的函数中。

        想要使用函数,一般要向他传递参数。在C中,我们必须按照函数定义时的参数一一对应的传参:

​#include<stdio.h>float sub(float a,int b)
{return (float)(a-b);
}int main()
{printf("%lf\n",sub(5.6,4));return 0;
}

        在Cpp中,有缺省参数的语法:

在函数定义的时候,给参数一个值,这个值是“备用的”,如果这个在调用此函数时,没有给参数传值,那么这个参数就会使用这个设定的默认值。

 


#include<iostream>int func(int a = 50)
{return a;
}
int main()
{std::cout << func(10) << std::endl;std::cout << func() << std::endl;return 0;
}

a默认值为50,有传值按照传递的值;无传值则默认为50. 

 缺省参数按照缺省的情况不同,分为全缺省参数和半缺省参数


 

全缺省参数

 在定义函数的时候,所有的参数都有默认值

//在定义的时候,对所有的参数设置有默认值void fun_c(int a = 1,int b = 2,int c = 3)
{std::cout << "a = " << a << std::endl;std::cout << "b = " << b << std::endl;std::cout << "c = " << c << std::endl;
}

 


半缺省参数

在定义函数的时候,部分参数有默认值

//部分参数有默认值——第一个参数a没有默认值,其余参数有默认值void fun_c2(int a,int b = 5,int c = 52)
{std::cout << "a = " << a << std::endl;std::cout << "b = " << b << std::endl;std::cout << "c = " << c << std::endl;
}

 

但是,有默认值的参数要放在函数定义的参数括号的最右侧,否则,编译器报错 

 

将有默认值的参数放到函数参数括号的右侧后,没有错误提示

 


 

 在使用的时候,由于有默认值的参数都放在函数的参数括号的最右侧,无默认值的参数在函数括号的左侧,所以手动传入的参数主要是给无缺省参数的参数。

 无法跨过没有默认值的参数,直接给有默认值的参数传参


void func2(int a ,int b = 5, int c = 8)
{std::cout << "a = " << a << std::endl;std::cout << "b = " << b << std::endl;std::cout << "c = " << c << std::endl;std::cout << std::endl;
}int main()
{func2(,1,2);func2(1,2);return 0;
}

 


 缺省参数只能在函数的声明中出现:

在项目内部时,缺省参数统一放在函数的声明中 

 main.cpp


#include"test.h"int main()
{std::cout << add(1,2) << std::endl;std::cout << add() << std::endl;return 0;
}

add.h

#ifndef TEST_H
#define TEST_Hint add(int a = 1,int b = 1);#endif

 add.cpp


int add(int a,int b)
{return a+b;
}

 编译成功,按照传入参数,和为3;按照默认参数,和为2;


对其他情况:

        在定义中设置默认参数;

        在定义和声明中都设置默认参数;

都无法编译通过。 

 只有在声明中设置默认参数,编译可以成功;


小结:

        1.半缺省参数(有默认值的参数)必须从右向左来给出,不能间隔着给;

         2.缺省参数不能在函数的声明和定义中同时出现,要将缺省参数放在声明中。

 

 (二)函数重载

在C中,我们无法定义任何一个同名的函数。当我们想要实现一系列功能类似,知识数据类型不同的函数时,我们只能在函数名上附带上一些标记:

add_int();
add_dou();
add_flo();
...

这就不利于我们编程。因为当函数类型更多时,记忆十分繁琐。

函数重载是Cpp为了方便编程,在C的基础上添加的新的语法。

 

函数重载的定义

函数重载是在同一个作用域中,可以声明几个功能类似的同名函数,但是需要满足的条件是:函数的形参列表不同->

        具体来说,形参列表不同指的是 参数个数,类型,类型顺序不同

 三种重载

 

 类型不同


int add_(int a,int b)
{return a+b;
}
double add_(double a,double b)
{return a+b;
}int main()
{std::cout << add_(1,2) << std::endl;std::cout << add_(1.5,2.6) << std::endl;return 0;
}

 

参数个数不同


int add_(int a,int b)
{return a+b;
}int add_(int a,int b,int c)
{return a+b+c;
}int main()
{std::cout << add_(1,2) << std::endl;std::cout << add_(3,5,9) << std::endl;return 0;
}

 

 类型顺序不同


void fun_c4(int a,char c)
{std::cout << a << std::endl;std::cout << c << std::endl;
}void fun_c4(char c,int a)
{std::cout << a << std::endl;std::cout << c << std::endl;
}int main()
{fun_c4(5,'v');fun_c4('p',5);return 0;
}

以上三种情况都是正确的,可以编译通过;编译器似乎可以自动识别函数的参数类型,他根据我们传入参数的类型来自动调用参数类型合适的函数。

 

但是为什么呢? 编译的时候,编译器是怎么识别的呢?

 与C不同的是,Cpp对函数名进行了不同的修饰,同名的函数,由于修饰的内容不同,所以最终Cpp编译器对于同名函数的名称能够区分开。

 

至于如何区分,具体请听下回解析~ 


完~ 

未经作者同意禁止转载 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Session机制详解

虽然session机制在web应用程序中被采 用已经很长时间了&#xff0c;但是仍然有很多人不清楚session机制的本质&#xff0c;以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在 Java web application中应用session机制时常见的问题作出解答。 一、术语ses…

element-ui的表单校验;el-form表单校验;el-form表单自定义校验;手机号校验;车牌号校验;车牌号正则校验;手动校验表单某一项;手动清空表单的某一项校验结果

示例&#xff1a;代码在末尾 可以直接复制使用 一、基本属性认知&#xff1a; 1. required: true 会有 * &#xff0c; 但仅是触发最后点击提交按钮时&#xff0c;校验某一项位必填&#xff1b;与输入事件或者选择或者失焦时候 怎么校验无关 &#xff08;这时候的校验取决于是…

Eclipse For JavaSE安装、配置、测试

Eclipse For JavaSE安装、配置、测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.安装与配置 4.JavaSE开发测试 5.ADT安装与Android开发测试 6.注意事项 7.相关博文 >>看不清的图片可在新标签打开查看大图 1.概述 eclipse应该是Java开发界家喻户晓的IDE了&#xff0c;通…

epoll的两种模式

From: http://haoningabc.iteye.com/blog/1432958 linux异步IO浅析 http://hi.baidu.com/_kouu/blog/item/e225f67b337841f42f73b341.html epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生…

关闭eslint检验;vue-cli3搭建的vue项目关闭eslint;脚手架3关闭eslint;

本文是解决关闭eslint的问题&#xff1b;如果想要开启eslint和配置&#xff0c;可以查看这篇开启eslint检验&#xff1b; 我们使用vue-cli3脚手架搭建vue项目时候&#xff0c;会默认选中eslint风格代码&#xff1b;如果想要关闭eslint检验&#xff0c;有如下两种方案&#xff…

转一篇关于并发和并行概念的好文,附带大神评论

转自&#xff1a;https://laike9m.com/blog/huan-zai-yi-huo-bing-fa-he-bing-xing,61/ 还在疑惑并发和并行&#xff1f; OK&#xff0c;如果你还在为并发&#xff08;concurrency&#xff09;和并行&#xff08;parallesim&#xff09;这两个词的区别而感到困扰&#xff0c;那…

MySQL索引背后的数据结构及算法原理-转

转 http://www.codinglabs.org/html/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象&#xff0c;讨论与数据库索引相关的一些话题。特别需要说明的是&#xff0c;MySQL支持诸多存储引擎&#xff0c;而各种存储引擎对索引的支持也各不相同&#xff0c;因此MySQL…

vue项目通过directives指令实现vue实现盒子的移动;vue拖拽盒子;vue移动;

vue项目&#xff1a;点击拖拽盒子&#xff1b;移动盒子&#xff1b; 代码可直接复制&#xff1a;&#xff08;注意需要在移动的盒子上添加 v-指令 注意采用固定定位&#xff09; <template><div class"far_box"><div>{{ msg }}</div><!-…

SuperAgent 中文乱码星号问号问题

看到星号问号了么&#xff0c;SuperAgent 爬取时中文乱码星号&#xff0c;只有中文是乱码&#xff0c;其它都是对的&#xff0c;肯定需要转义&#xff0c;找了两个小时&#xff0c;最后度娘看到个帖子 https://cloud.tencent.com/developer/article/1445392试了试&#xff0c;…

制作 Windows8   to Go

制作 Windows to Go 将准备好的 Windows 8 的镜像文件&#xff08;ISO 格式&#xff09;加载到虚拟光驱中去&#xff1b;将准备好的 USB 存储设备插入&#xff1b;打开控制面板&#xff0c;点击“Windows To Go”&#xff1b;在接下来的选项中按照步骤提示选择对应的 Win 8 的镜…

vue监听浏览器刷新和关闭;

注意&#xff1a;区分不了浏览器是触发了刷新还是关闭&#xff0c;而且提示的弹框是无法自定义的&#xff1b;如果有大佬有方法能区分&#xff0c;还请评论学习一下&#xff01;感谢&#xff01; 代码可直接复制&#xff1a; <template><div><div /></di…

计算文件的md5;vue计算文件md5值;计算图片的md5值;

github链接 1.先下载 npm i browser-md5-file -S2.在使用的vue页面引入和声明方法 import BMF from browser-md5-file const bmf new BMF()3.使用方法&#xff1a; function handle(e) {const file e.target.files[0];bmf.md5(file,(err, md5) > {console.log(err:, err);…

【转】【天道酬勤】 腾讯、百度、网易游戏、华为Offer及笔经面经

面试完毕&#xff0c;已跟网易游戏签约。遂敲一份笔经面经&#xff0c;记录下面试经过。类似于用日记记录自己&#xff0c;同时希望对师弟师妹有一定帮助。不是炫耀&#xff0c;只是希望攒RP&#xff0c;希望各位不要鄙视我。正所谓“饮水思源”。小弟来自广州华南理工大学&…

⭐️ vue项目使用微信表情;vue引入微信表情emoji;vue中使用微信表情包emoji;

以下的表情是通过引入emoji-vue插件做的&#xff1b;如果只是简单的显示个别表情&#xff0c;其实还可以用html的emoji的标签来完成 &#x1f61d;&#x1f64a;&#x1f47f;&#x1f525;&#x1f335;&#x1f344;&#x1f349;&#x1f1e8;&#x1f1f3;&#x1f61a;&am…

奈奎斯特采样定理:

&#xff08;1&#xff09;奈奎斯特采样定理&#xff1a; 当采样频率fs.max大于信号中最高频率fmax的2倍时&#xff0c;即&#xff1a;fs.max>2fmax,则采样之后的数字信号完整地保留了原始信号中的信息&#xff1b; 转载于:https://www.cnblogs.com/jocobHerbertPage/archiv…

vue项目引入字体图标iconfont

直接将icon下载成图片使用或者通过import方式移入url使用&#xff0c;看此篇 本文介绍两种使用方案&#xff1a;1.使用Font class引入字体图标&#xff08;推荐&#xff09; 2.使用Symbol 引用 如果是分批次的下载了好几次字体图标&#xff0c;那么可以将解压的代码css等文件放…

Why is processing a sorted array faster than an unsorted array?

这是我在逛 Stack Overflow 时遇见的一个高分问题&#xff1a;Why is processing a sorted array faster than an unsorted array?&#xff0c;我觉得这是一个非常好的用来讲分支预测&#xff08;Branch Prediction&#xff09;的例子&#xff0c;分享给大家看看 一、问题引入…

uni-app微信小程序uni.getLocation获取位置;authorize scope.userLocation需要在app.json中声明permission;小程序用户拒绝授权后重新授权

需求&#xff1a;点击按钮获取当前微信位置&#xff0c;以及点击拒绝授权后&#xff0c;下次点击还可以拉起授权窗口&#xff1b; 拒绝授权后重新拉起授权操作&#xff1a; 直接授权操作&#xff1a; 一、问题1&#xff1a;报authorize scope.userLocation需要在app.json中声明…

PHP代码审计之反序列化攻击链CVE-2019-6340漏洞研究

关键词 php 反序列化 cms Drupal CVE-2019-6340 DrupalKernel 前言 简简单单介绍下php的反序列化漏洞 php反序列化漏洞简单示例 来看一段简单的php反序列化示例 <?phpclass pingTest {public $ipAddress "127.0.0.1";public $isValid False;public $output…

Portal-Basic Java Web 应用开发框架:应用篇(八) —— 整合 Freemarker

Portal-Basic Java Web应用开发框架&#xff08;简称 Portal-Basic&#xff09;是一套功能完备的高性能Full-Stack Web应用开发框架&#xff0c;内置稳定高效的MVC基础架构和DAO框架&#xff08;已内置Hibernate、MyBatis和JDBC支持&#xff09;&#xff0c;集成 Action拦截、F…