初识C++ (二)

简介: 初识C++ (二)

上节课输入输出问题的一些补充


其实printf和cout之间并没有明显的优劣之分

大家根据自己的需要 根据使用的方便程度自行选择就好


一. 缺省参数


我们这里先来看百度上的定义


所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。


什么意思捏 好像还是有点不理解 那么我们来上代码


我们写出下面这段代码


void func(int a = 10)
{
  cout << "a:  " << a << endl;
}


我们再main函数里面运行一下试试看


我们可以发现 咦 好像不使用参数也可以运行!

7b5bad3c65f643bdbaa0132358cc7d46.png


接下来我们试试看使用参数会有什么效果


9cae60ff2ae94d37aad239975862260f.png


接下来看看其他值怎么样


20也是可以的


6d478b496a5e40b699a9b264a3ab736c.png


那么这里我们就可以发现一个规律了


当我们在调用函数的时候不指定值的时候它就会使用我们函数定义时的默认值


当我们在调用函数的时候指定值的时候使用的参数就是指定值


1.1 半缺省参数


半缺省参数即使缺省一部分的参数(注意这里并不是一半)


注意点!!!


我们这里必须要从右往前缺省参数 以下格式是绝对不可以的

61ea6ec8f18c43d69f8cd7aea0915e43.png


我们有代码如下


void func2(int a , int b = 20, int c = 30)
{
  cout << "a: " << a << endl;
  cout << "b: " << b << endl;
  cout << "c: " << c << endl;
}


调用格式如下


func2(10);


打印结果如下

53d835833d8345c29aa964a8a18fc67c.png



1.2 全缺省参数


比如说这样子的代码


void func3(int a=10, int b = 20, int c = 30)
{
  cout << "a: " << a << endl;
  cout << "b: " << b << endl;
  cout << "c: " << c << endl;
}


我们可以有以下调用方式


int main()
{
  func3();
  func3(1);
  func3(1,2);
  func3(1,2,3);
  return 0;
}

但是我们这里要注意的是


像是这样子的调用是绝对不被允许的


//func(, ,3)


因为我们的函数传参是严格按照从左到右的顺序


4c8d3126f9524b3eabc7c206ca0b38a4.png


1.3 补充


缺省参数不能声明定义都有! 只能有一个有


二. 函数重载


2.1 重载是什么意思?


从简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形


也就是说 一个函数名可以对应多个函数


那么我们要怎么区分这几个函数呢?


2.2 如何区分重载函数


参数类型不同

例如下面两个函数


void test1(int a)
{
  ;
}
void test1(double a)
{
  ;
}


它们就是两个同名的重载函数


参数个数不同

例如下面这两个函数


void test1(int a)
{
  ;
}
void test1(int a , char b)
{
  ;
}


参数顺序不同

例如下面这两个函数


void test1(int a , char b)
{
  ;
}
void test1(char a, int b)
{
  ;


附加题1

我们来思考下这两个函数


它们是否是重载函数呢


void test1()
{
  ;
}
void test1(int a = 10)
{
  ;
}


我们这里传参的时候是不会报错的


但是如果说不传参的话就会存在歧义


对吧 两个都可以不传参调用 你要返回哪个呢?


附加题2

返回值不同 这里构成重载嘛?


这个问题是不是和上面的一样啊


我们怎么区分要调用哪个函数呢?


2.3 c++支持函数重载的原理

我们都知道 函数处理需要进行四个阶段


预处理

它的作用有四个


头文件展开

宏定义的替换

条件编译

去掉注释


编译

检查语法


所以说我们的语法错误报错是在编译阶段报错的


汇编

转换成二进制指令


连接

合并段表

符号表的合并和重定位


这里主要问题出现在连接阶段


为什么呢?


这里简单的提一嘴


在第三步汇编语言变成了二进制语言


在c语言中


是函数调用call函数 再调用jump函数 再找到函数


是这样子的 f(?)


再c++中


也是一个这样子的过程


但是会对函数名字(由于参数不同)进行一个加工所以说c++会支持重载函数


总结


本节课学习了缺省参数(包括半缺省和全却省)


学习了重载函数(如何区分)


简短的介绍了c++的函数重载原理


相关文章
|
9天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201862 13
对话 | ECS如何构筑企业上云的第一道安全防线
|
17天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179633 22
|
5天前
|
弹性计算 人工智能 安全
|
4天前
|
安全 数据安全/隐私保护
阿里云 SASE 2.0 能力迭代|构建一体化办公数据安全解决方案
阿里云SASE能力全新升级,快速构建数据安全治理与运营体系。
1083 5
|
26天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9821 29
|
4天前
|
搜索推荐 物联网 PyTorch
Qwen2.5-7B-Instruct Lora 微调
本教程介绍如何基于Transformers和PEFT框架对Qwen2.5-7B-Instruct模型进行LoRA微调。
371 32
Qwen2.5-7B-Instruct Lora 微调
|
7天前
|
机器学习/深度学习 人工智能 安全
阿里云先知安全沙龙(武汉站) ——AI赋能软件漏洞检测,机遇, 挑战与展望
本文介绍了漏洞检测的发展历程、现状及未来展望。2023年全球披露的漏洞数量达26447个,同比增长5.2%,其中超过7000个具有利用代码,115个已被广泛利用,涉及多个知名软件和系统。文章探讨了从人工审计到AI技术的应用,强调了数据集质量对模型性能的重要性,并展示了不同检测模型的工作原理与实现方法。此外,还讨论了对抗攻击对模型的影响及提高模型可解释性的多种方法,展望了未来通过任务大模型实现自动化漏洞检测与修复的趋势。
|
12天前
|
机器学习/深度学习 分布式计算 供应链
阿里云先知安全沙龙(上海站) ——大模型基础设施安全攻防
大模型基础设施的安全攻防体系涵盖恶意输入防御和基础设施安全,包括框架、三方库、插件、平台、模型和系统安全。关键漏洞如CVE-2023-6019(Ray框架命令注入)、CVE-2024-5480(PyTorch分布式RPC)及llama.cpp中的多个漏洞,强调了代码安全性的重要性。模型文件安全方面,需防范pickle反序列化等风险,建议使用Safetensors格式。相关实践包括构建供应链漏洞库、智能化漏洞分析和深度检测,确保全方位防护。
|
11天前
|
机器学习/深度学习 人工智能 安全
通义视觉推理大模型QVQ-72B-preview重磅上线
Qwen团队推出了新成员QVQ-72B-preview,这是一个专注于提升视觉推理能力的实验性研究模型。提升了视觉表示的效率和准确性。它在多模态评测集如MMMU、MathVista和MathVision上表现出色,尤其在数学推理任务中取得了显著进步。尽管如此,该模型仍存在一些局限性,仍在学习和完善中。
|
11天前
|
Java Maven
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
在执行Maven项目中的`install`命令时,遇到编译插件版本不匹配的错误。具体报错为:`maven-compiler-plugin:3.13.0`要求Maven版本至少为3.6.3。解决方案是将Maven版本升级到3.6.3或降低插件版本。本文详细介绍了如何下载、解压并配置Maven 3.6.3,包括环境变量设置和IDEA中的Maven配置,确保项目顺利编译。
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案