首页 > 编程语言 >C++基础2: 优化C函数

C++基础2: 优化C函数

时间:2023-04-20 20:35:29浏览次数:33  
标签:ps 函数 int 缺省 C++ 参数 include 优化 stack

1. 缺省参数

什么是缺省参数

缺省参数是声明或者定义函数时为函数的参数指定一个默认值,如果函数调用时没有传入实参, 那么这个默认值会被当做实参,如下例子

函数调用时, 传入参数1, a = 1,不传入参数, 默认a = 0, 这里的a就是一个缺省参数

缺省参数的分类

缺省参数分全缺省和半缺省参数

全缺省参数: 每个参数都有默认值

#include <iostream>
using namespace std;

// 全缺省
void t2(int a = 1, int b = 2, int c = 3)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl << endl;
}

int main()
{
	t2();
	t2(10);
	t2(10, 20);
	t2(10, 20, 30);
}

半缺省参数: 部分参数带有默认值

#include <iostream>
using namespace std;

// 半缺省参数
void t3(int a, int b = 1, int c = 2)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl << endl;
}
int main()
{
	t3(10);
	t3(10, 20);
	t3(10, 20, 30);
}

使用缺省参数的注意事项

1. 半缺省参数必须从右往左, 不能有间隔

2. 传入的实参必须从左往右, 不能有间隔

3. 缺省参数不能再函数声明和定义出重复出现

4. 如果函数声明与定义分离时, 在函数声明里定义缺省参数

缺省参数的应用

下面用一个实际的应用场景来说明为什么缺省参数会是C函数设计中的不足

C语言实现的栈初始化:

head.h
 #pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

#define INIT_SZ 4

typedef int STDataType;
typedef struct stack
{
	STDataType* dys;
	int capacity;
	int top;
}stack;

// 初始化
void STInit(stack* ps);
test.c
 #include "head.h"

void STInit(stack* ps)
{
	assert(ps);
	STDataType* tmp = (STDataType*)malloc(sizeof(STDataType) * INIT_SZ);
	if (NULL == tmp)
	{
		perror("STInit::malloc fail");
		return;
	}
	ps->dys = tmp;
	ps->capacity = INIT_SZ;
	ps->top = 0;
}

int main()
{
	stack st;
	STInit(&st);
}

C++用缺省参数实现的栈初始化:

head.h
 #pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int STDataType;
typedef struct stack
{
	STDataType* dys;
	int capacity;
	int top;
}stack;

// 初始化
void STInit(stack* ps, int capacity = 4); // 缺省参数 capacity
test.cpp
#include "head.h"

void STInit(stack* ps, int def_capacity)
{
	assert(ps);
	STDataType* tmp = (STDataType*)malloc(sizeof(STDataType) * def_capacity);
	if (NULL == tmp)
	{
		perror("STInit::malloc fail");
		return;
	}
	ps->dys = tmp;
	ps->capacity = def_capacity;
	ps->top = 0;
}

int main()
{
	stack st1;
	stack st2;
	// 处理未知数据个数的情况
	STInit(&st1);
	// 处理已知数据个数的情况
	STInit(&st2, 100);
}

假设已经知道要向栈内入100个数据, C语言实现的栈需要不断的扩容, 而C++ 可以用缺省参数直接初始化100个空间提高效率

即使数据个数未知, 也可以不传参用默认开辟的空间, 不够时扩容, 所以使用缺省参数会更灵活

2. 函数重载

什么是函数重载

函数重载是函数的一种特殊情况,其允许在同一域中出现同名的函数

但是这些同名函数必须满足(参数类型不同, 参数个数不同, 参数顺序不同)其中一个条件, 如下

// 1、参数类型不同
int Add(int left, int right)
{
    return left + right;
}
 
double Add(double left, double right)
{ 
    return left + right;
}
// 2、参数个数不同
void f()
{
    cout << "f()" << endl;
}
 
void f(int a)
{
    cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}
 
void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}

标签:ps,函数,int,缺省,C++,参数,include,优化,stack
From: https://www.cnblogs.com/xumu11291/p/17320940.html

相关文章

  • 阶乘 reduce函数 operator模块
       fromfunctoolsimportreducefromoperatorimportmuldeffact(n):#使用reduce和operator.mul函数计算阶乘returnreduce(mul,range(1,n+1))#使用reduce函数和一个匿名函数计算阶乘#returnreduce(lambdaa,b:a*b,range(1,n+1)) ......
  • 引用作函数形参交换两个整数
    一.问题描述:设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作。二.编程思路:1.设计一个void类型的函数swap2.设置两个引用类型的参数3.输入两个参数4.交换两个整数并输出三.代码实现:#include<iostream>usingnamespacestd;voi......
  • java -- 函数式编程
    函数式编程面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是怎么做。有时只是为了做某事情而不得不创建一个对象,而传递一段代码才是我们真正的目的。LambdaLambda是一个匿名函数,可以理解为一段可以传递的代码。......
  • linux设备树-设备树常用OF操作函数
    ----------------------------------------------------------------------------------------------------------------------------内核版本:linux5.2.8根文件系统:busybox1.25.0u-boot:2016.05-------------------------------------------------------------------------------......
  • django中开启事务,GEO地理位置信息、持久化方案、主从复制原理和方案、哨兵高可用、集
    django中开启事务#django中如何开启事务全局开启:每个http请求都在一个事务中DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'lqz','HOST'......
  • c++打卡第四天
    一、问题描述。有一对兔子,第三个月开始每月生一对兔子,刚出生的兔子经过三个月又可以生一对兔子,问从1月开始到n月,每月兔子的数量。二、设计思路。①、第一二个月都是一对兔子,第三个月是2对,3个月是三对,第四个月就是5对。②、由此可知,这个月兔子对数的总量等于前一个月和前两个月......
  • hive函数
    用pig的时候,超不爱用pig带的函数,一般都自己写但是用hive,就越来越懒,变成了能不写就不写自己的udf,哈哈 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1.内置运算符 1.1关系运算符  运算符类型说明A=B所有原始类型如果A与B相等......
  • C/C++《程序设计基础(C语言)课程设计》[2023-04-20]
    C/C++《程序设计基础(C语言)课程设计》[2023-04-20]《程序设计基础(C语言)课程设计》课程说明及动员《程序设计基础(C语言)课程设计》指导教师组目录课程目的>>课程要求>>团队题目>>实施方案>>课程设计报告>>考核与成绩评定方法>>本学期实施安排>>其他说明课程目的......
  • Oracle 开窗函数 三个排序函数的区别
    1.ROW_NUMBER2.RANK3.DENSKRANK这三个函数都是依托窗口函数进行的分组后的排序,对于排序的特点有些细节的区别ROW_NUMBER()就是简单地按照Partitionby要分组的字段排序,若orderby后的字段值相同会区分出大小(原则不详),整体来说是的由1到N的排序selectt.*,row_number()over......
  • C++课本第四章例题
    时钟类的完整例题#include<iostream>usingnamespacestd;classClock{private:inthour,minute,second;public:voidsetTime(inthour=0,intminute=0,intsecond=0);voidshowTime();};voidClock::setTime(intnewH,intnewM,i......