【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

相关文章

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理