前言
上节小编讲解了命名空间和函数的输入输出,本节将讲解缺省参数,函数重载等知识。
1.缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左
依次连续缺省,不能间隔跳跃给缺省值。
例如(错误示范)
void func(int a, double b = 3.14, const char* c = "default") { // 正确 // 函数体 } void func(int a = 1, double b, const char* c = "default") { // 错误,不能跳过 b // 函数体 }
#include <iostream> using namespace std; void func(int x=0) { cout << x << endl; } int main() { // 没有传参时,使⽤参数的默认值 // 传参时,使⽤指定的实参 func(); func(10); return 0; }
运行结果:
0
10
带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
#include <iostream> using namespace std; // 全缺省 void Func1(int a = 10, int b = 20, int c = 30) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl << endl; } // 半缺省 void Func2(int a, int b = 10, int c = 20) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl << endl; } int main() { Func1(); Func1(1); Func1(1, 2); Func1(1, 2, 3); Func2(100); Func2(100, 200); Func2(100, 200, 300); Func2(100, ,300);//错误 return 0; }
函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省
值。
// 在头文件中的函数声明 void func(int a = 1, double b = 3.14, const char* c = "default"); // 在源文件中的函数定义 void func(int a, double b, const char* c) { // 函数体 }
2.函数重载
在C++中,函数重载(Function Overloading)是指在同一作用域内可以存在多个同名函数,但这些函数的参数列表(参数的个数、类型或者顺序)必须不同。编译器会根据传递给函数的参数来决定调用哪一个重载版本。
2.1函数重载的基本规则
1.参数数量不同:函数可以具有不同数量的参数。
#include <iostream> using namespace std; int Add(int a, int b) { return a + b; } int Add(int a, int b, int c) { return a + b + c; } int main() { int sum1 = Add(10, 20); double sum2 = Add(10,20,30); cout << "sum1: " << sum1 << endl; cout << "sum2: " << sum2 << endl; return 0; }
2. 参数类型不同:函数可以具有不同类型的参数。
#include <iostream> using namespace std; int add(int a, int b) { cout << "int add(int a, int b)"<<endl; return a + b; } double add(double a, double b) { cout << "double add(double a, double b)"<<endl; return a + b; } int main() { int sum1 = add(10, 20); double sum2 = add(1.5, 2.5); cout << "sum1: " << sum1 << endl; cout << "sum2: " << sum2 << endl; return 0; }
3. 参数顺序不同:如果参数类型相同,但顺序不同,也可以构成重载。
#include <iostream> using namespace std; 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; } int main() { f(10, 'c'); f('c', 10); return 0; }
2.2注意事项
- 返回类型:函数重载与返回类型无关,即不能仅通过改变返回类型来重载函数。
-默认参数:使用默认参数的函数可能会导致重载解析的歧义,应当小心使用。
int Add(int a, int b) { return a + b; } double Add(int a, int b) { // 错误:不能仅通过返回类型来重载 return static_cast<double>(a + b); }
#include <iostream> using namespace std; // 下⾯两个函数构成重载 // f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁 void f() { cout << "f()" << endl; } void f(int a = 10) { cout << "f(int a)" << endl; } int main() { f(); return 0; }
2.3 重载解析(Overload Resolution)--补充内容
当调用一个重载函数时,编译器会根据提供的实参和每个重载函数的形参列表进行匹配,以确定调用哪一个函数。这个过程称为重载解析。如果编译器无法明确地确定应该调用哪个函数,或者找到多个合适的匹配,就会产生编译错误。
函数重载是C++多态性的一种形式,它允许程序员使用相同的名字来执行相似的操作,这增强了代码的清晰性和可读性。
C++基础篇(2)(下):https://developer.aliyun.com/article/1624928