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

C++第四篇:函数增强

 前言:

C++ 在函数方面相比 C 语言引入了许多增强特性,主要包括 ​​函数重载、默认参数、内联函数、函数模板、Lambda 表达式等。这些特性提高了代码的灵活性、安全性和性能。这篇文章只说前三个,后面的会单独写一篇来讲。

一、编译器对函数名处理方法

这是一段简单的代码我分别使用C和C++去编写,然后使用下面这行命令,来查看汇编程序的。 

g++ -S 源文件.cpp -o 目标文件.s

 C++程序:

#include "iostream"int add(int a,int b)
{return a+b;
}int main()
{add(3, 5);return 0;
}

C语言: 

 

C++:

  可以看到这两段程序的的函数标签并不都是add,C++的是_Z3addii,这就是C++对函数的增强,采用的是:

_z(c++中函数的起始标记)+3(函数名的长度)+函数名+参数类型

这样做就意味着函数的可以起相同名字,只需要参数的类型和数量不要完全相同的就可以。这样在一定程度上帮助了程序编写的命名问题,这也叫函数重载。函数增强不仅于此,再看下面。

二、默认参数

        在 函数声明时为参数提供一个默认值 , 当函数调用时没有指定这个参数的值,编译器会自动使用默认值代替。

直接看示例:

#include "iostream"int add(int a,int b,int c = 50)
{return a+b+c;
}int main()
{std::cout << "add的结果为: " << add(3, 5) << std::endl;return 0;
}

 结果如下:

  

没有问题。但这是需要注意的是,在声明的定义分开的时候,需要将默认参数放在声明的地方。如下:

#include "iostream"int add(int a,int b,int c = 50);int main()
{std::cout << "add的结果为: " << add(3, 5) << std::endl;return 0;
}
int add(int a,int b,int c)
{return a+b+c;
}

 还有一个需要注意的点就是:如果某个参数是默认值参数,那么它后面的参数必须都是默认参数

int add(int a,int b = 10,int c);            //错误,后面的参数也必须有默认值

再看最后一个。 

三、内联函数

1.普通函数的问题:在执行程序过程中如果要进行函数调用,则系统要将程序当前的一些状态信息存到栈中,同时转到函数的代码处去执行函数体语句, 这些参数保存与传递的过程中需要时间和空间的开销,使得程序执行效率降低 ,特别是在程序频繁地进行函数调用以及函数代码段比较少时,这个问题会变得更为严重。

2.内联函数:为了解决这个问题,C++引入了内联函数机制。 就是将需要调用函数的代码,直接替换到调用函数的地方。

使用的方式也非常简单,如下:

#include "iostream"
//强制内联
// inline __attribute__((always_inline)) int add(int a,int b,int c = 50)//非强制内联,只是建议编译器,最终是编译器决定是否内联inline int add(int a,int b,int c = 50)                                         
{return a+b+c;
}
int main()
{std::cout << "add的结果为: " << add(3, 5) << std::endl;return 0;
}

再说一下内联函数的使用场景: 

 ​​适合内联的场景​​:

  • 短小且频繁调用的函数(如 maxmingetter/setter)。
  • 替代宏,提高安全性。
  • 类内定义的成员函数

不适合内联的场景​​:

  • 递归函数。
  • 复杂函数(代码膨胀)。
  • 虚函数(运行时多态,无法内联)。
http://www.dtcms.com/a/395130.html

相关文章:

  • C#上位机软件:1.7 熟悉VS并开启你的第一个C#程序
  • Nextcloud App增加模块内嵌网页
  • 04-django配置日志-loguru
  • docker离线部署gpt-oss-20b流程,从下载到安装再到可以使用
  • 关系数据库MySQL的常用基础命令详解实战
  • 面向动态环境的MEC突破:MLGO微算法科技推出自适应权重深度确定性策略梯度(AWDDPG)算法,革新多用户任务迁移技术
  • Ansys Zemax | 确保自由曲面设计的可制造性
  • 智造新势力:看“文化+科技”如何重塑制造新范式
  • 【算法训练营Day25】动态规划part1
  • 打破网络壁垒:使用内网穿透轻松实现远程桌面访问
  • 2025 PyCharm IDE 社区版与专业版合并后,新手该如何安装?(附 Toolbox 图形化安装教程)
  • 07-css元素定位布局
  • 波动率曲面及SVI模型的Python数值拟合
  • 基于Python新闻平台的文本数据挖掘系统
  • 2017/12 JLPT听力原文 问题四
  • 【Tawk】Tawk.to聊天小部件移动端位置调整完整指南
  • jieba 库
  • 开启 3D 之旅 - 你的第一个 WebGL 三角形
  • 基于AWS Lambda的机器学习动态定价系统 CI/CD管道部署方案介绍
  • 3D 文件格式解释
  • 对Hive表进行归档,减少小文件的影响
  • R 中,geo 数据集 分析探针转基因的时候,一个探针对应的多个基因的情况
  • 机器学习-逻辑回归-考试预测通过-1
  • 计算机中用8位如何计算最大值和最小值-128~127
  • PyTorch 神经网络工具箱完全指南
  • docker一键安装部署若依Ruoyi-Vue(保姆级)
  • 通义DeepResearch论文六连发全面解读
  • 大模型应用-prompt提示词工程
  • Windows 命令行:使用路径名和文件名来启动文件
  • 稻瘟病监测仪的功能用途