【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++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的