C++从入门到精通——缺省参数
时间:2024-04-01 10:00:39 来源:网络cs 作者:淼淼 栏目:卖家故事 阅读:
缺省参数
前言一、缺省参数概念二、缺省参数分类位置参数的缺省参数全缺省参数半缺省参数 关键字参数的缺省参数函数指针的缺省参数`lambda`表达式 三、缺省参数的具体代码展示main.cpp
前言
缺省参数是在函数定义时指定的默认值,当调用函数时未提供该参数的值时,将使用缺省值。使用缺省参数可以简化函数调用,提高代码可读性。但需注意,过多使用缺省参数可能导致代码难以理解和维护。
一、缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。这种机制允许函数在更广泛的情境下被调用,提高了代码的灵活性和可重用性。
在许多编程语言中,如Python、Java和C++等,都支持缺省参数的概念。下文将以C++为例,通过在函数定义时为某些参数指定默认值,就可以创建出可以接受可变数量参数的函数。这样,当调用者只提供了部分参数时,函数依然可以正确地执行,而那些没有提供值的参数则会使用默认值。
这种设计不仅方便了开发者,也使得代码更加易于理解和维护。因为当函数有多个参数时,如果每个参数都必须明确提供,那么调用者就需要记住每个参数的意义和顺序,这无疑增加了出错的概率。而有了缺省参数,即使调用者忘记了某个参数的值,函数也能正常工作,只是使用了预设的默认值而已。
此外,缺省参数还有助于实现函数的重载。在某些语言中,虽然不直接支持函数重载(即多个同名函数,但参数列表不同),但可以通过结合缺省参数和可变参数来实现类似的效果。这样,就可以根据调用者提供的参数数量和类型,执行不同的函数逻辑。
ps:关于函数重载,我将在下篇文章详细讲解
然而,虽然缺省参数带来了很多便利,但使用时也需要谨慎。过多的缺省参数可能导致函数的行为变得难以预测,因为调用者可能不清楚哪些参数使用了默认值,哪些参数是明确提供的。因此,在设计函数时,应该合理地选择哪些参数应该有默认值,哪些参数应该是必须的。
#include<iostream>using namespace std;void Func(int a = 0){cout << a << endl;}int main(){Func(); // 没有传参时,使用参数的默认值Func(10); // 传参时,使用指定的实参return 0;}
二、缺省参数分类
缺省参数分类是程序设计中常见的一种参数设置方式。它允许在函数调用时省略某些参数,这些参数会使用预设的默认值。缺省参数可以分为两类:位置缺省参数和关键字缺省参数。位置缺省参数根据函数参数列表中的顺序确定默认值,而关键字缺省参数则通过指定参数名来设置默认值。这种分类方式有助于简化函数调用,提高代码的可读性和灵活性。
在 C++ 中可以分为以下几种类型:
位置参数的缺省参数
全缺省参数
void Func(int a = 10, int b = 20, int c = 30) { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; }
半缺省参数
void Func(int a, int b = 10, int c = 20) { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; }
如果参数不够就会报错
注意:
半缺省参数必须从右往左依次来给出,不能间隔着给缺省参数不能在函数声明和定义中同时出现//a.h void Func(int a = 10); // a.cpp void Func(int a = 20) {} // 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用哪个缺省值。
缺省值必须是常量或者全局变量C语言不支持(编译器不支持) 关键字参数的缺省参数
在函数的参数列表中使用关键字参数,并为其设置默认值。调用函数时可以不传入这些参数,而是使用默认值。
void greet(string name, string message = "Hello") { // message 是缺省参数,设定默认值为 "Hello" cout << message << ", " << name << endl;}greet("Alice"); // 输出 "Hello, Alice"greet("Bob", "Good morning"); // 输出 "Good morning, Bob"
函数指针的缺省参数
对于C++函数指针不理解的地方,可看作者的后续文章
在函数的参数列表中可以设置一个函数指针作为参数,并为其设置默认值。
void printNumber(int num) { cout << num << endl;}void processNumber(int num, void (*func)(int) = printNumber) { func(num);}processNumber(123); // 输出 123processNumber(456, [](int num) { cout << "Number: " << num << endl; }); // 输出 "Number: 456"
关于
processNumber(456, [](int num) { cout << "Number: " << num << endl; }); // 输出 "Number: 456"
这段代码定义了一个名为processNumber
的函数,该函数有两个参数:一个整数num
和一个函数指针。函数指针指向一个没有返回值的函数,该函数接受一个整数作为参数,并在函数体内打印出该整数。
[](int num) { cout << "Number: " << num << endl; }
上述代码是个空函数,后面大括号里的是这个空函数里的代码,只不过是放在同一排上,正常应如下,这种叫lambda
表达式,可以按照我说的方式来理解
{cout << "Number: " << num << endl; }
当调用processNumber
函数时,传入的第一个参数是456
,第二个参数是一个lambda
表达式,这个lambda
表达式定义了一个匿名函数,其参数为一个整数num
,函数体内打印出"Number: "
加上num
的值,然后换行。
因此,调用processNumber(456, [](int num) { cout << "Number: " << num << endl; });
的结果将是打印出"Number: 456"
。
需要注意的是,在 C++ 中,缺省参数只能从右到左连续出现,即在参数列表中,缺省参数必须位于非缺省参数的右侧。
lambda
表达式
在C++中,lambda
表达式被用于创建匿名函数。它的语法与其他编程语言中的lambda
表达式相似。
在C++中,lambda
表达式的语法为:
[capture list](parameters) -> return_type { // 函数体}
其中,capture list
是可选的,用于捕获外部变量,可以是空的或包含一个或多个外部变量。parameters
是函数的参数列表,可以为空。return_type
是函数的返回类型,可以省略或使用auto
自动推导。
下面是一个示例,使用lambda
表达式定义一个函数,打印输入的数字:
void processNumber(int num, const std::function<void(int)>& callback) { callback(num);}int main() { int num = 456; processNumber(num, [](int num) { std::cout << "Number: " << num << std::endl; }); return 0;}
在上面的示例中,processNumber
函数接受一个数字和一个callback
函数作为参数。callback
是一个std::function
类型,其中的参数为int
类型。在main
函数中,我们使用lambda
表达式作为回调函数,打印输入的数字。
三、缺省参数的具体代码展示
main.cpp
#include<iostream>using namespace std;//void Func(int a = 0)//{//cout << a << endl;//}//void Func(int a = 10, int b = 20, int c = 30)//{//cout << "a = " << a << endl;//cout << "b = " << b << endl;//cout << "c = " << c << endl;//}void Func(int a, int b = 10, int c = 20){cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;}void greet(string name, string message = "Hello") { // message 是缺省参数,设定默认值为 "Hello"cout << message << ", " << name << endl;}void printNumber(int num) {cout << num << endl;}void processNumber(int num, void (*func)(int) = printNumber) {func(num);}int main(){//Func(); // 没有传参时,使用参数的默认值//Func(10); // 传参时,使用指定的实参//Func();/*Func(60);Func(50,100);*///greet("Alice"); // 输出 "Hello, Alice"//greet("Bob", "Good morning"); // 输出 "Good morning, Bob"processNumber(123); // 输出 123processNumber(456, [](int num) { cout << "Number: " << num << endl; }); // 输出 "Number: 456"return 0;}
阅读本书更多章节>>>>
本文链接:https://www.kjpai.cn/gushi/2024-04-01/151876.html,文章来源:网络cs,作者:淼淼,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!