函数详细解析

news2024/9/23 23:22:27

目录

形参有默认值的函数

基本概述

指令角度

设定形参默认值

内联函数

基本概述

代码段

函数重载

答疑解惑


形参有默认值的函数

基本概述

从右向左设定形参默认值

形参默认值可以在定义时设定,也可以在声明时设定

每个形参的默认值只能被设定一次

指令角度

#include<iostream>
using namespace std;

int sum(int a = 10, int b = 20)
{
    return a + b;
}

int main()
{
    int a = 10;
    int b = 20;

    int ret = sum(a, b);
    /*
    mov eax, dword ptr[ebp-8]
    push eax
    mov ecx, dword ptr[ebp-4]
    push ecx
    call sum
    */

    ret = sum(a);
    /*
    push 14H
    mov ecx, dword ptr[ebp-4]
    push ecx
    call sum
    */

    ret = sum();
    /*
    push 14H
    push 0Ah
    call sum
    */

    return 0;
}

设定形参默认值

#include<iostream>
using namespace std;

// int sum(int a = 10, int b)
// {
//     return a + b;
// }
// 违背基本概述中的“从右向左设定形参默认值”,错误!

int sum(int a, int b = 20)
{
    return a + b;
}
// 遵循基本概述中的“从右向左设定形参默认值”,正确!

int main()
{
    int a = 10;
    int b = 20;

    int ret = sum(a, b);
    cout << "ret:" << ret << endl;

    return 0;
}
#include<iostream>
using namespace std;

// int sum(int a, int b = 20);
// int sum(int a, int b = 20);
// 违背基本概述中的“每个形参的默认值只能被设定一次”,错误!

int sum(int a, int b = 20);
int sum(int a = 10, int b);
// 注意!这是正确的写法!
// 遵循基本概述中的“从右向左设定形参默认值”,正确!

int main()
{
    int a = 10;
    int b = 20;

    int ret = sum(a, b);
    cout << "ret:" << ret << endl;

    return 0;
}

int sum(int a, int b)
{
    return a + b;
}

内联函数

基本概述

关键字为inline

内联函数不会生成相应的函数符号

inline在debug版不发挥作用,在release版才发挥作用

使用关键字inline仅仅表示建议编译器将该函数当作内联函数,如果函数很复杂,编译器仍然将其视为普通函数

不是所有使用关键字inline的函数都被处理成内联函数,例如,递归函数不会被处理成内联函数

普通函数与内联函数的区别

调用普通函数有调用开销

内联函数在编译阶段将函数在调用点进行展开处理,省去了函数调用开销

代码段

#include<iostream>
using namespace std;

inline int sum(int x, int y)
{
    return x + y;
}

int main()
{
    int a = 10;
    int b = 20;

    int ret = sum(a, b);
    cout << "ret:" << ret << endl;
    
    return 0;
}

函数重载

答疑解惑

函数重载的含义

一组重载函数一定是处在同一作用域中

一组重载函数,函数名相同,参数的个数或类型不同

函数重载是静态(编译时期)多态的一种

// 以下代码用于演示一组函数不在同一作用域导致无法构成重载的情况,同时产生错误

#include<iostream>
#include<string.h>
using namespace std;

bool compare(int a, int b)
{
    cout << "bool compare(int a, int b)" << endl;
    return a > b;
}

bool compare(double a, double b)
{
    cout << "bool compare(double a, double b)" << endl;
    return a > b;
}

bool compare(const char * a, const char * b)
{
    cout << "bool compare(const char * a, const char * b)" << endl;
    return strcmp(a, b) > 0;
}

int main()
{
    bool compare(int a, int b);
    // 因为此处对compare(int, int)的声明
    // 导致compare(int, int)处在局部作用域
    // 而compare(double, double)和compare(char *, char *)处在全局作用域
    // 不满足“一组重载函数一定是处在同一作用域中”这一条件,无法重载!

    bool b1 = compare(10, 20);
    bool b2 = compare(10.10, 20.20);
    bool b3 = compare("abcd", "efgh");

    cout << b1 << endl << b2 << endl << b3 << endl;

    return 0;
}

 

// 以下代码用于演示正确的函数重载

#include<iostream>
#include<string.h>
using namespace std;

bool compare(int a, int b)
{
    cout << "bool compare(int a, int b)" << endl;
    return a > b;
}

bool compare(double a, double b)
{
    cout << "bool compare(double a, double b)" << endl;
    return a > b;
}

bool compare(const char * a, const char * b)
{
    cout << "bool compare(const char * a, const char * b)" << endl;
    return strcmp(a, b) > 0;
}

int main()
{
    bool b1 = compare(10, 20);
    bool b2 = compare(10.10, 20.20);
    bool b3 = compare("abcd", "efgh");

    cout << b1 << endl << b2 << endl << b3 << endl;

    return 0;
}

 

为什么C++支持函数重载,C语言不支持函数重载?

C++代码产生的函数符号由函数名和参数类型组成,多个重载函数产生互不相同的函数符号,可以通过链接

C代码产生的函数符号只由函数名决定,多个相同的函数符号将导致链接错误

函数重载的注意事项有哪些?

const、volatile关键字对形参类型的影响

函数名和参数列表相同、返回值不相同的函数不存在重载关系

C++和C语言代码如何互相调用函数?

因为C++和C语言生成函数符号的规则不同,所以C++和C语言代码无法直接互相调用

无论C++调C,还是C调C++,都需要在C++中使用extern "C" { },extern "C" { }只能被C++识别!

extern "C" { }使得C++编译器按照C语言的规则来生成{ }中函数的符号

// extern "C" { }的灵活运用

#ifdef __cplusplus
extern "C"
{
#endif
    int sum(int a, int b)
    {
        return a + b;
    }
#ifdef __cplusplus
}
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为HCIP第二节-------------------------ISIS

IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNetwork Protocol&…

1200*B. Vanya and Lanterns

Examples input 7 15 15 5 3 7 9 14 0 output 2.5000000000 input 2 5 2 5 output 2.0000000000 解析&#xff1a; 最大距离即为每相邻两盏灯之间的最大距离/2 注意起点没有灯&#xff0c;终点可能有灯&#xff0c;需要分别判断 #include<bits/stdc.h> using nam…

前端html中让两个或者多个div在一行显示,用style给div加上css样式

文章目录 前言一、怎么让多个div在一行显示 前言 DIV是层叠样式表中的定位技术&#xff0c;全称DIVision&#xff0c;即为划分。有时可以称其为图层。DIV在编程中又叫做整除&#xff0c;即只得商的整数。 DIV元素是用来为HTML&#xff08;标准通用标记语言下的一个应用&#x…

如何在MacBook上彻底删除mysql

好久以前安装过&#xff0c;但是现在配置mysql一直出错&#xff0c;索性全部删掉重新配置。 一、停止MySQL服务 首先&#xff0c;请确保 MySQL 服务器已经停止运行&#xff0c;以免影响后续的删除操作。 sudo /usr/local/mysql/support-files/mysql.server stop如果你输入之…

DAY3,Qt(完成闹钟的实现,定时器事件处理函数的使用)

1.完成闹钟的实现&#xff0c;到点播报文本框的内容&#xff1b; ---alarm.h---头文件 #ifndef ALARM_H #define ALARM_H#include <QWidget> #include <QTimerEvent> //定时器处理函数类 #include <QTime> //时间类 #include <QPushButton> //按钮…

小红书舆情处理方法丨小红书负面笔记处理的三种技巧

小红书作为一个生活分享平台&#xff0c;经常会刷到一些负面笔记。更多用户的浏览&#xff0c;点赞收藏&#xff0c;评论行为会使笔记热度更高&#xff0c;笔记搜索排名靠前&#xff0c;如果品牌对负面舆情处置方法不当很可能影响公司品牌信誉&#xff0c;导致用户流失。 小红书…

WEB:unseping

背景知识 php序列化和反序列化 命令执行绕过方式 题目 进行代码审计 可知为反序列化 整体是创建case类&#xff0c;可接受post传来的ctf值 _consturuct函数,是在函数调动前启用&#xff0c;构造了$method和$args两个变量。 _dexstruct函数在变量摧毁的时使用&#xff0c;所…

HDU - 7315 Data Generation( 2023“钉耙编程”中国大学生算法设计超级联赛第四场 D)

题目大意 Yoshinow2001 \text{Yoshinow2001} Yoshinow2001 正在为他的问题生成数据。他想要生成 { 0 , … , n − 1 } \{0,…,n−1\} {0,…,n−1} 的一个随机排列&#xff0c;因此他使用了以下算法&#xff1a; 在这里&#xff0c;我们可以假设函数 rand ⁡ ( ) m o d n \ope…

超声功率放大器基本原理和设计流程

超声功率放大器是一种将低功率信号放大到高功率信号的设备&#xff0c;是实现超声成像、治疗和检查的关键组件。它主要由功率放大电路、控制电路、保护电路等部分组成。本文将介绍超声功率放大器的技术方案&#xff0c;包括其基本原理、设计流程及注意事项。 基本原理 超声功率…

闭环排队理论简介

闭环排队理论简介 1. 系统情景2. 数学描述 在排队理论简介一文中&#xff0c;笔者详细介绍了排队理论的基本内容。在该文中&#xff0c;申请流是来自系统外部的&#xff0c;其强度&#xff08;或密度&#xff09;并不取决于系统本身&#xff0c;也不取决于系统的状态。而在本文…

网络安全法律法规

数据参考&#xff1a;CISP官方 目录 国家立法体系网络安全法解析网络安全相关法律 一、国家立法体系 1、我国的立法体系 我国的立法体系在网络空间治理中扮演着基础工作的角色。为了应对快速发展的网络技术和威胁&#xff0c;我国采取了多级立法机制来完善网络空间的法律…

【uniapp】十分钟带你封装uniapp的api请求

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 前言 最近刚好接了个私活&#xff0c;顺便把之前做到的项目中没有写出来的功能点单独拿出来写一篇吧&#xff01; 其实在我的uniapp专栏里面写了不少关…

Kafka 入门到起飞系列 - 怎么从ISR中选出的Leader呢? Leader选举机制

上文我们讲了分区分成Leader 和 Follower两种角色&#xff0c;当Leader宕机后&#xff0c;会从ISR同步副本中选出一个分区作为leader分区继续工作&#xff0c;那么leader是怎么选出来的呢&#xff1f; 怎么从ISR中选出的Leader呢&#xff1f; Leader选举机制 比如有这么个分布…

梯度下降法和牛顿法

梯度下降法和牛顿法都是优化方法。 梯度下降法 梯度下降法和相关知识可以参考导数、偏导数、梯度、方向导数、梯度下降、二阶导数、二阶方向导数一文。梯度下降法是一种迭代地每次沿着与梯度相反方向前进的不断降低损失函数的优化方法。梯度下降只用到一阶导数的信息&#xf…

word怎么转换成pdf?分享几种转换方法

word怎么转换成pdf&#xff1f;将Word文档转换成PDF文件有几个好处。首先&#xff0c;PDF文件通常比Word文档更容易在不同设备和操作系统上查看和共享。其次&#xff0c;PDF文件通常比Word文档更难以修改&#xff0c;这使得它们在需要保护文件内容的情况下更加安全可靠。最后&a…

Linux 学习记录59(ARM篇)

Linux 学习记录59(ARM篇) 本文目录 Linux 学习记录59(ARM篇)一、IIC总线1. 概念2. IIC总线硬件连接 二、系统框图三、IIC时序1. 起始信号 / 停止信号2. 数据传输信号3. 应答信号 / 非应答信号4. 寻址信号 四、IIC协议1. 主机给从机发送一个字节(写)2. 主机给从机发送多个连续字…

Lab———Git使用指北

Lab———Git使用指北 &#x1f916;:使用IDEA Git插件实际工作流程 &#x1f4a1; 本文从实际使用的角度出发&#xff0c;以IDEA Git插件为基本讲述了如果使用IDEA的Git插件来解决实际开发中的协作开发问题。本文从 远程仓库中拉取项目&#xff0c;在本地分支进行开发&#x…

【C++】STL中list的模拟实现(增删查改,迭代器封装,运算符重载)

文章目录 前言大体框架&#xff1a; 一、节点的封装&#xff08;list_node&#xff09;二、迭代器的封装(_list_iterator)1.类模板的定义&#xff1a;2.构造函数3.前置&#xff0c;后置4.前置--&#xff0c;后置--5.解引用(operator*())6. ->重载&#xff08;operator- >…

代码随想录算法学习心得 49 | 647.回文子串、516.最长回文子序列...

一、最长回文子序列 链接&#xff1a;力扣 描述&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 思…

练习时长两年半的入侵检测

计算机安全的三大中心目标是&#xff1a;保密性 (Conf idential ity) 、完整性 (Integrity) 、可用性 (Availability) 。 身份认证与识别、访问控制机制、加密技术、防火墙技术等技术共同特征就是集中在系统的自身加固和防护上&#xff0c;属于静态的安全防御技术&#xff0c;…