【带头学C++】----- 八、C++面向对象编程 ---- 8.10 函数的默认参数

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;
}
相关推荐
一点媛艺5 分钟前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风9 分钟前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生1 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功1 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
pianmian11 小时前
python数据结构基础(7)
数据结构·算法
Nu11PointerException1 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang