【C++】弥补C语言的不足(②有默认参数的函数)

2024-03-22 00:28

本文主要是介绍【C++】弥补C语言的不足(②有默认参数的函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🌻缺省参数

我们先来看一个简单地例子,对于在函数的定义中三个形参都给定默认值:

#include <iostream>
using namespace std;
void fun(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl<<endl;
}
int main()
{fun();fun(11);fun(11, 22);fun(11, 22, 33);return 0;
}

运行结果如下图所示:

对于上面这个函数,它是全缺省函数。
下面,我们再来看一下半缺省函数。对于半缺省函数,缺省值只能从右往左给,必须是连续给。如果从右往左给,会出现歧义。
在上面函数的基础上修改即可得,半缺省函数。

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

关于缺省参数,我们需要注意的是,不能声明和定义同时给。
若声明和定义同时给,就会出现报错,如下:

对于这个问题,由于函数声明在函数定义之前,因此以声明时给出的默认值为准,而忽略定义函数时给出的默认值。
即:

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

🌻缺省参数的意义

上面以简单的例子简述了全缺省参数与半半缺省参数。但是缺省参数的函数,有什么意义吗?上面的例子中似乎看不出缺省参数函数的意义。
下面,我们以栈为例,说明缺省参数函数的意义。

我们用栈存储我们的数据,我们会先初始化我们的栈,然后给出一个栈的空间。然后存入我们的数据,如果栈不为满,则继续存入,如果栈满,那么进行扩容。那么问题就在开辟空间这里。我们是开辟10个空间还是100个空间亦或是更多的呢?扩容的时候一般也是根据初始的栈容量进行扩容的,所以一个的空间容量至关重要。

若我们不知道我们要存入多少个数据,我们不妨就设置为开辟4个内存空间,扩容的话,也是4的倍数,这样不至于空间太大的浪费。
若我们提前知道,我们要存入100个或者1000个数据的话,那么我们就直接传入参数为1000,使得初始栈的空间就为1000。

所以接下来我们利用缺省参数的想法来改善一下我们之前的栈结构。如下:

声明栈结构

typedef struct Stack
{int *a;int top;int capacity;
}Stack;


初始化栈

void StackInit(Stack *ps,int n=4)
{assert(ps);ps->a=(int *)malloc(sizeof(Stack)*n);//开辟n个空间;ps->top=0;ps->capacity=n;
}

对于栈的初始化,我们就采用了缺省参数。如果我们不清楚要开多少个空间,那么就用我们自己给定的4个空间。

StackInit(&s)

若我们提前知道大概是多少个空间,那么传入参数即可:

StackInit(&s,100);//开辟1001个内存空间

栈的销毁

void StackDestory()
{assert(ps);free(p->a);ps->a=NULL;ps->top=ps->capacity=0;
}

入栈----StackPush()

void StackPush(Stack *ps,int x)
{assert(ps);//判断栈的空间是否已满if(ps->top==ps->capacity){//扩容为原容量的2倍datatype *tmp=(int *)relloc(ps->a,sizeof(Stack)*capacity*2);ps->capacity=ps->capacity*2;}ps->a[ps->top]=x;ps->top++;
}

入栈,扩容也是根据我们capacity的值。这样既可以保证我们的空间够用,且不至于很大的浪费。
出栈----StackPop()

void StackPop(Stack *ps)
{assert(ps);//判断当前栈是否为空,若空则无法出栈,退出程序assert(ps->top >0);ps->top--;
}

这篇关于【C++】弥补C语言的不足(②有默认参数的函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834175

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function