【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

相关文章

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码