【带头学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;
}
相关推荐
西柚研究生12345616 分钟前
论文分析15:跨层特征交互的多尺度无人机小目标检测算法
人工智能·算法·目标检测
油丶酸萝卜别吃5 小时前
utils.js 说明文档
开发语言·javascript·ecmascript
rannn_1118 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer8 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
leisoo80978 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴8 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
青瓦梦滋9 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
AI备案指南-满满9 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤9 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝9 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法