141. C++
函数
函数指针
函数的地址是存储其机器语言代码的内存开始的地址
好处:可在在不同的时间使用不同的函数(可以把函数当做参数传递)
声明:
1
2
3
4// 函数原型
double sum(double, double)
// 函数指针声明
double (*ptrSum)(double, double)注意:
- 该语句声明了一个指针
ptrSum
,指向一个函数 double *ptrSum(double, double)
不是函数指针,而是:声明了一个函数ptrSum
,返回double *类型
- 该语句声明了一个指针
用法
1
2
3
4
5
6
7
8
9// 声明power函数
int power(int, int);
// 声明函数指针
int (*powerPtr)(int, int);
// 让声明的函数指针指向函数,以便调用
powerPtr = power;
// 调用
powerPtr(3, 4)
(*powerPtr)(3, 4)应用
题目
用函数指针实现加减乘除
代码
Caculator.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71/**
* author Qeuroal
* date 2021/5/19
* description
*/
using namespace std;
// 自定义计算器,使用函数指针
/**
* 加法
* @return
*/
double addition(double, double);
/**
* 减法
* @return
*/
double subtraction(double, double);
/**
* 乘法
* @return
*/
double multiplication(double, double);
/**
* 除法
* @return
*/
double division(double, double);
/**
* 打印计算结果
* param double (*)(double , double ) 函数指针
*/
void printResult(double (*)(double , double ), double, double);
void printResult(double (*calcPtr)(double, double), double num1, double num2) {
// 调用函数,打印结果
double result = calcPtr(num1, num2);
cout << "运算结果为:" << result << endl;
return;
}
double addition(double num1, double num2) {
return num1 + num2;
}
double subtraction(double num1, double num2) {
return num1 - num2;
}
double multiplication(double num1, double num2) {
return num1 * num2;
}
double division(double num1, double num2) {
if (num2 == 0) {
cout << "除数不能为0!!" << endl;
return 0;
}
return num1 / num2;
}FuncPtr.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37/**
* author Qeuroal
* date 2021/5/19
* description
*/
using namespace std;
int main() {
// 定义函数指针
double (*calcPtr)(double, double) = nullptr;
// 定义函数指针数组
double (*calcPtrArray[])(double, double) = {};
cout << "请输入两个操作数:";
double num1, num2;
cin >> num1 >> num2;
cout << "请输入运算符:";
char op;
cin >> op;
switch (op) {
case '+':
calcPtr = addition;
break;
case '-':
calcPtr = subtraction;
break;
case '*':
calcPtr = multiplication;
break;
case '/':
calcPtr = division;
break;
}
printResult(calcPtr, num1, num2);
}
注意
要用函数指针的话,先定义函数,再定义函数指针;
在
C11
中可以使用auto funcPtr = addition;
自动推断类型(自动类型推断需要确保变量的类型与初值类型一致);使用
auto
时,需要初始化,否则会报错;可以使用
typedef
简化声明:1
2
3typedef double (*funcPtr)(double, double);
// 此时funcPtr是一个新的类型,而不是一个函数指针,真正的函数指针是calcPtr
funcPtr = calcPtr;
面向对象
注意点。
- 类一般是在头文件定义
.h文件
声明类的结构,.cpp文件
实现类的成员函数
实例化方法(以无参构造为例)
假设定义了
Person
类。
省略了默认构造:
Person person;
(在栈内存中直接分配空间)标准写法:
Person person();
(在栈内存中直接分配空间)指针写法:
Person *person = new Person();
(在堆内存分配空间,并用指针person
指向该内存空间)如果构造函数中只有一个是带唯一的参数,如下所示:
类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Person {
public:
Person(int age) {
this->age = age;
}
Person(string name, int age) {
this->name = name;
this->age = age;
}
private:
string name;
int age;
};实例化
1
Person person =20;
构造函数
正常写法(略)
简化写法:初始化参数列表写法
1
Person::Person(string name, int age) : name(name), age(age) {}