当前位置: 首页 > article >正文

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

8.10 函数的默认参数

C++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没有指定这个值,编器会自动用默认值代替。

      通过为函数参数指定默认值,可以在调用函数时省略相应的参数,而该参数将使用默认值。如果调用函数时提供了该参数的值,则它将覆盖默认值。

// 使用默认参数的函数示例
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

再看案例:

 

代码:

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++在声明函数时,可以设置占位参数,占位参数只有参数类型,而没有参数名。一般情况下,在函数体内部无法使用占位参数。

 

代码:

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

#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

#include <stdio.h>
#include "func.h"

int myAddfunc(int x,int y){
    return x+y;
}

main

#include <iostream>
#include <string>
#include "func.h"

using namespace std;

void test06(){
    cout << myAddfunc(14,29)<<endl;
}
int main()
{
    test06();
    return 0;
}

http://www.kler.cn/a/149595.html

相关文章:

  • ❤React-React 组件基础(类组件)
  • 如何在算家云搭建Peach-9B-8k-Roleplay(文本生成)
  • 微擎框架php7.4使用phpexcel导出数据报错修复
  • 读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录
  • 移动端【01】面试系统的MVVM重构实践
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • Python基础语法之学习字符串快速格式化
  • C\C++:原子计数操作 之__syn_fetch_and_add性能研究
  • 前后端分离开发出现的跨域问题
  • 压缩字符串II
  • Maven 介绍
  • C语言基础程序设计题
  • 爬虫如何确定HTTP代理IP是否符合自己业务需求?
  • Android 13.0 app进程保活白名单功能实现
  • Python语言学习笔记之二(基础语法)
  • leetcode 611. 有效三角形的个数(优质解法)
  • 去水印软件有哪些?亲测四款好用去水印神器
  • redis使用
  • “rhdf5filters.so’ not found when install ‘glmGamPoi‘ package
  • AUTOSAR系统服务篇 - BswM
  • RPG项目01_UI登录
  • 如何在 Vim 中剪切、复制和粘贴
  • leetcode 打家劫舍
  • [栈溢出+参数跟踪] [ZJCTF 2019]Login
  • 【LeetCode】挑战100天 Day13(热题+面试经典150题)
  • Excel导入组件的封装以及使用页面点击弹出该弹框