C++入门学习(2)缺省参数

简介: C++入门学习(2)缺省参数

27ce524cf9f945628b4d27a05c62fd03.png前言

 继上回我们学习了命名空间和在C++里面的输入输出之后,我们知道了命名空间可以解决C语言命名冲突的问题,也简单掌握了命名空间的使用,我们已经可以写出简单的C++代码,所以大家还是要继续练习敲代码,提高语感。

#include <iostream>
using namespace std;
int main()
{
    cout << "hello world" << endl;
    return 0;
}


而今天我们就继续来学习C++对C语言的改进,今天主要介绍的是缺省参数。

让我们一起往下学习吧!

一、缺省参数的诞生

1.1 缺省的意思

缺省是一种计算机的术语,大家理解成默认的意思就行,所以缺省参数的意思就是默认参数

1.2 缺省参数诞生的原因


既然缺省参数是一个参数,大家可以想一下什么的场景下会用到参数呢?用到函数的时候会用到参数对吧,大家继续想一下,在C语言中,我们没有给函数的形参传值的时候,函数的形参是不是都没有默认值,也就是,我们只要不传参数,就会编译错误,所以C++在这方面做了改善,给函数的形参增加了缺省值(默认值),大家知道这点之后,就让我们正式学习一下缺省参数吧!

二、缺省参数的定义

缺省参数是在声明或者定义函数时,为函数的参数指定一个缺省值(默认值)。

在调用该函数时,如果我们没有给指定的实参,则采用该形参的缺省值,否则使用指定的实参。


看下面代码和执行的结果:

#include <iostream>
using namespace std;
int Add(int x,int y = 3)
{
    return x + y;
}
int main()
{
    int sum1 = Add(2);
    int sum2 = Add(2,4);
    cout << "没有给y传入实参的sum1 = " << sum1 << endl;
    cout << "给y传入实参的sum2 = " << sum2 << endl;
    return 0;
}


从这里可以看出我们给y一个缺省参数为3


所以当我们传实参只传了个2的时候,只是给x传,而没有给y传,所以返回的就是5


但是当我们都传入了实参的时候,返回的就是6


这就应证了上面的话:在调用该函数时,如果我们没有给指定的实参,则采用该形参的缺省值,否则使用指定的实参。


9b94811fc6de4c0abda28b620bbc3e13.png

那缺省参数可以怎么写呢?如果存在多个参数,我们可以随意地给缺省值吗?接下来就是我们下一个要学习的东西,缺省参数的分类


三、缺省参数的分类

3.1 全缺省参数

顾名思义,就是把所有的形参都给上缺省值

下面的代码就是把所有的形参都给了缺省值,这样的就叫做全缺省参数。我们写完函数体之后,肯定要调用我们的函数,但是这里就又出现了问题,我们应该如何去调用呢?


我们将下面的代码放到自己的编辑器上,就会发现如下报错:

#include <iostream>
using namespace std;
void Func(int a = 10, int b = 20, int c = 30)
{
     cout << "a = " << a << endl;
     cout << "b = " << b << endl;
     cout << "c = " << c << endl << endl;
}
int main()
{
    Func();      // 1
    Func(1);     // 2
    Func(1,2);   // 3
    Func(1,2,3); // 4
    Func(1,,3);  // 5 错误
    Func(,,3);   // 6 错误
    return 0;
}



27ce524cf9f945628b4d27a05c62fd03.png

这里的报错就说明的我们在调用含有缺省参数的函数时,传入的形参必须是从左往右依次传入,不能跳着给。

3.2 半缺省参数

既然知道了全缺省参数是全部的形参都给缺省值,那半缺省参数就是不给全部,只给一部分的形参 缺省值


那我们可以怎么给缺省值呢?可以跳着给吗?让我们一起看看吧!


我们如下三种代码,经过测试只有第一个是对的


所以也就是说半缺省参数,禁止跳着给,也禁止给左边不给右边


那半缺省参数的规则就是:从右往左依次给

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


在讲完这些,关于缺省参数还有一个重要的规则要说明一下

四、缺省参数在函数定义和函数声明中的规则


我们规定,缺省参数不能在函数的定义和声明中同时出现

如果函数定义和声明同时存在,缺省参数放到函数声明中。

由于函数的定义在主函数的上面再进行声明是冗余(多余)的声明,所以我把函数定义放在主函数下定义:

在这段代码中,我们的函数定义和函数声明是同时存在的,所以我们把缺省参数放在函数声明里,这个是可以正常运行的。

#include <iostream>
using namespace std;
void Func(int a = 10,int b = 20,int c = 30 );
int main()
{
    Func(1);
    Func(1,2);
    Func(1,2,3);
    return 0;
}
void Func(int a,int b,int c)
{
    cout <<"a = "<< a << endl;
    cout <<"b = "<< b << endl;
    cout <<"c = "<< c << endl << endl;
}


但是我在这里把缺省参数放到函数的定义里,不放在函数声明里,在调用的时候就会报错,这是为什么呢?


因为在我们的程序里,它会以函数声明为准,函数声明里都没有缺省参数,我们不可以用有缺省参数的形式来传参,所以里面两个会报错。

综上所述,我们以后在面对函数定义和函数声明同时存在的时候,需要用到缺省参数时,一定要放在声明中。

相关文章
|
4月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
51 0
|
8月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
7月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
9月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
136 16
|
10月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
203 4
2023/11/10学习记录-C/C++对称分组加密DES
|
12月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
372 6
|
12月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
105 0
|
12月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
134 0
|
12月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)