【带头学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;
}
相关推荐
文弱书生6569 分钟前
5.后台运行设置和包设计与实现
服务器·开发语言·c#
编码浪子14 分钟前
趣味学RUST基础篇(异步补充)
开发语言·后端·rust
..过云雨14 分钟前
03.【Linux系统编程】基础开发工具1(yum软件安装、vim编辑器、编辑器gcc/g++)
linux·c语言·笔记·学习
宁静致远202118 分钟前
【C++设计模式】第五篇:装饰器模式
c++·设计模式·装饰器模式
songroom20 分钟前
Rust : 关于Deref
开发语言·后端·rust
qq_4017004123 分钟前
QT子线程与GUI线程安全交互
开发语言·qt
高-老师27 分钟前
R语言生物群落(生态)数据统计分析与绘图实践技术应用
开发语言·r语言·生物群落
Joy-鬼魅30 分钟前
怎么生成qt的pro文件
开发语言·qt
青草地溪水旁31 分钟前
Linux 高性能 I/O 事件通知机制的核心系统调用—— `epoll_ctl`
linux·c语言·c++
肥肠可耐的西西公主32 分钟前
后端(FastAPI)学习笔记(CLASS 3):Tortoise ORM
笔记·学习·fastapi