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
$