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)。
  • 替代宏,提高安全性。
  • 类内定义的成员函数

不适合内联的场景​​:

  • 递归函数。
  • 复杂函数(代码膨胀)。
  • 虚函数(运行时多态,无法内联)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值