8.10 函数的默认参数
C++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没有指定这个值,编器会自动用默认值代替。
通过为函数参数指定默认值,可以在调用函数时省略相应的参数,而该参数将使用默认值。如果调用函数时提供了该参数的值,则它将覆盖默认值。
cpp
// 使用默认参数的函数示例
int add(int a, int b = 0) {
return a + b;
}
// 调用函数时省略默认参数
int result1 = add(5); // 此时 b 默认为 0,结果为 5 + 0 = 5
// 调用函数时提供参数值来覆盖默认参数
int result2 = add(5, 3); // 此时 b 被覆盖为 3,结果为 5 + 3 = 8
再看案例:
代码:
cpp
void TestFunc01(int a = 10,int b = 20){
cout << "a + b = "<< a+b<<endl;
}
//注意点:
//1.形参b设置默认参数值,那么后面位置的形参c也需要设置默认参数
void TestFunc02(int a,int b = 10,int c = 10){
cout << "a + b + c = "<< a+b+c<<endl;
}
//2。如果函数声明和函数定义分开,函数声明设置了默认参数,函数定义不能再设置默认参数
void TestFunc03(int a = 0,int b = 0); //函数声明
void TestFunc03(int a,int b){} //函数定义
void test03(){
//如果没有传参数,那么使用默认参数
TestFunc01();
//2.如果传一个参数,那么第二个参数使用默认参数
TestFunc01(100);
//3. 如果传入两个参数,那么两个参数都使用我们传入的参数
TestFunc01(100,200);
}
强调一下:
注意点1:形参按照参数位置的顺序传值,最左边参数设置了默认参数,右边也必须设置参数。
注意点2:默认函数碰上函数重载的时候,注意调用时的二义性。
8.11 占位参数
c++在声明函数时,可以设置占位参数,占位参数只有参数类型,而没有参数名。一般情况下,在函数体内部无法使用占位参数。
代码:
cpp
void zwTestFunc01(int x,int y,int){
//函数内部无法使用占位参数
cout << "x+y = " << x+y <<endl;
}
//占位参数也可以使用默认参数
void zwTestFunc02(int x,int y,int = 20){
//但是函数内部还是无法使用占位参数
cout << "x+y = " << x+y <<endl;
}
void test05(){
//错误调用
//zwTestFunc01(10,20); //少一个参数,不行
//正确
zwTestFunc01(10,20,30);
//正确
zwTestFunc02(11,22); //第三个是默认参数
//正确
zwTestFunc02(11,22,33);//可以修改默认参数进行赋值
}
8.12 extern C使用C语言来进行C++混合编程的处理方法
在Linux下测试例如:
c函数: void MyFunc(){} 被编译成函数: MyFunc
c++函数: void MyFunc(){} 被编译成函数:_Z6Myfuncv
通过这个测试,由于C++中需要支持函数重载,所以(和C++中对同一个函数经过编译后生成的函数名是不相同的,这就导致了一个问题,如果在C++中调用一个使用C语言编写模块中的某个函数,那么C++是根据C++的名称修饰方式来查找并接这个函数,那么就会发生链接错误,以上例,C++中调用MyFunc函数,在链接阶段会去找_Z6MVfuncy,结里是没有找到的,因为这个MyFunc数是语言编写的,生成的符号是MFunc。
那么如里我想在++调C的函数怎么办?extern "C" 的主要作用就是为了实现C++代码能够调用其他C语言代码。加上extern"C"后,这部分代码编译器按C语言的方式进行编译和链接,而不是按C++的方式。
案例分析:定义一个fun.c fun.h文件
错误分析:
1.fun.c文件
2.fun.h文件
3.此时main文件是报错的,直接使用C文件的代码是报错的
正确案例:
在头文定义的时候,使用extern "C"声明该段代码是C语言的代码,这时候编译器会使用c编译器去编译。
代码:
fun.h
cpp
#ifndef FUNC_H
#define FUNC_H
#if __cplusplus
extern "C"{
#endif
extern int myAddfunc(int x,int y);
#if __cplusplus
}
#endif
#endif // FUNC_H
fun.c
cpp
#include <stdio.h>
#include "func.h"
int myAddfunc(int x,int y){
return x+y;
}
main
cpp
#include <iostream>
#include <string>
#include "func.h"
using namespace std;
void test06(){
cout << myAddfunc(14,29)<<endl;
}
int main()
{
test06();
return 0;
}