C++ 函数
函数
函数指针
使用函数指针把函数当做参数传递
```c++
//定义一个函数
void print(string& content) {cout << content << endl;}
//函数的第一个参数就是函数指针
void callPrint(void (*f) (string&), string& param) {f(param); //调用函数指针指向的函数}
int main() {
string content{ "allen" }; //使用函数指针,把print方法当做参数直接传递给callPrint方法 callPrint(print, content); //输出allen return 0;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 代码 `void (*f) (string&)` 定义了一个函数指针
- f 是函数指针变量名
- 这个指针指向一个接收 string 引用且无返回值的方法
- 可以使用 `auto f` 替代上面那一坨
- 可以使用 `using` 定义别名
- ```c++
using printType = void (*) (string&);
void callPrint(printType f, string& param) {
f(param);
}
函数对象
1 | //函数对象类型 |
- 函数对象就是一个重载了函数调用运算符
operator()()的普通的对象
std::function 模板
1 |
|
- 使用 std::function 定义的参数可以同时接受函数指针和函数对象
匿名函数(lambda 表达式)
- 定义形式
[capture](parameters) -> returnType { body } [capture]用于让匿名函数的内部逻辑具备访问匿名函数外部变量的能力(parameters)用于声明匿名函数的参数-> returnType是匿名函数返回值类型(返回类型后置,一般可以忽略){ body }是匿名函数的函数体
lambda 捕获外部变量
[],不捕获任何外部变量,此时在匿名函数体内使用外部变量都会报错。[=]:按值捕获所有外部变量。[&]:按引用捕获所有外部变量。[x, &y]:x 按值捕获,y 按引用捕获。[&, x]:x 按值捕获,其他变量按引用捕获。[=, &x]:x 按引用捕获,其他变量按值捕获。[this]:捕获匿名函数所在作用域的对象,this 是当前对象的指针,此时不会复制整个对象。[*this]:捕获匿名函数所在作用域的对象的副本,此时会复制整个对象。
使用 [=] 或 [&] 捕捉外部变量时,只有在匿名函数体内真正使用到的变量才会被复制或引用
1 | int main() { |
泛型匿名函数
1 | // 注意此方法的返回值是auto类型的,实际上返回的是一个方法指针 |
this 指针与链式调用
**在执行一个对象的成员函数时,编译器会为该成员函数自动生成一个指针:this**,这个指针就是调用该成员函数的对象指针。
1 | class ORM { |
执行对象的成员函数时,我们可以在函数体内直接访问对象的成员变量或方法
- 编译器把这样的代码:
callYourClassMethod();,翻译成这样的代码:this->callYourClassMethod();
- 编译器把这样的代码: