C++函数( Lambda、inline 、多载、指标)第二部

Lambda 函数

Lambda 函数是C++11 新增的函数形式,这是种匿名函数,也就是不需要函数识别字,简单举例如下

#include <iostream>
  
int main() {
    auto f = [](int i) {return i * i;};
    
    std::cout << f(11) << std::endl;
    std::cout << f(22) << std::endl;
    std::cout << f(16) << std::endl;
    
    return 0;
}

Lambda 函数用中括弧与小括弧组成,此例的lambda 函数为简化的形式,中括弧可放置作用域中的变数,而小括弧则放置lambda 函数的参数

auto f = [](int i) {return i * i;};

因此接下来就是透过变数f使用这个匿名的lambda 函数

std::cout << f(11) << std::endl;
std::cout << f(22) << std::endl;
std::cout << f(16) << std::endl;

编译执行,结果如下

$ g++ u0806.cpp -std=c++0x
$./a.out 复制代码
121
484
256
$

inline函数

inline 函数定义经常重复的小型工作模组,例如

#include <iostream>
  
inline int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    std::cout << max(55, 22) << std::endl;
    std::cout << max(2, 214) << std::endl;
    
    return 0;
}

这里定义了一个inline函数,工作为判断两个参数的大小,并且回传较大值

inline int max(int a, int b) {
    return a > b ? a : b;
}

编译器(compiler) 会将inline函数的部份最佳化,通常会把inline函数的程式直接插入执行档编译,避免过多的函数呼叫,因此上例会变成

 
std::cout << 55 > 22 ? 55 : 22 << std::cout;
std::cout << 2 > 214 ? 2 : 214 << std::cout;

所以inline函数的目的除了提高效能外,也在于提供一个符合语意的名称,此例编译执行结果如下

$ g++ u0807.cpp
$./a.out 复制代码
55
214
$

多载函数

函数可以有多个参数版本,这样的函数被称为多载(overload) ,例如

#include <iostream>
  
void do_something(int n1, int n2, int n3) {
    std::cout << n1 + n2 + n3 << std::endl;
}

void do_something(double n1, double n2, double n3) {
    std::cout << n1 + n2 + n3 << std::endl;
}

void do_something(int n1) {
    std::cout << n1 << std::endl;
}

int main() {
    do_something(10);
    do_something(0.2, 4.5, 6.1);
    do_something(3, 4, 5);
    
    return 0;
}

这里定义了三个do_something()函数,有三种参数版本,第一个版本需要三个整数参数

void do_something(int n1, int n2, int n3) {
    std::cout << n1 + n2 + n3 << std::endl;
}

第二个版本需要一个浮点数参数与两个整数参数

void do_something(double n1, double n2, double n3) {
    std::cout << n1 + n2 + n3 << std::endl;
}

第三个版本则只需要一个整数参数

void do_something(int n1) {
    std::cout << n1 << std::endl;
}

不同的参数版本使相同名称的函数能够处理不同的资料型态(data type) ,此例编译执行结果如下

$ g++ u0808.cpp
$./a.out 复制代码
10
10.8
12
$

函数指标

函数也可以用指标来呼叫,这样的指标被称为函数指标,例如

#include <iostream>
  
void fun1(void) {
    std::cout << "fun1" << std::endl;
}

int fun2(int n) {
    return 0;
}

int main() {
    void (*f1Ptr)(void) = fun1;
    int (*f2Ptr)(int) = fun2;
    
    f1Ptr();
    std::cout << f2Ptr(1) << std::endl;
    
    return 0;
}

第12 行与第13 行分别定义函数指标,留意函数指标的写法,先是函数的回传值型态,然后用小括弧围住带星号的识别字,后面则是小括弧与参数列

void (*f1Ptr)(void) = fun1;
int (*f2Ptr)(int) = fun2;

这是说,函数指标只能指向具有相同回传值型态与参数列的函数。

下面利用函数指标呼叫函数

f1Ptr();
std::cout << f2Ptr(1) << std::endl;

编译执行,结果如下

$ g++ u0809.cpp
$./a.out 复制代码
乐趣1
0
$

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值