函数
自定义函数的完整写法:
注:
- 函数原型与函数定义的头部类似,最后以分号结尾
- 函数原型中的参数名称可以省略,只写参数类型
- C++中返回值类型不能是数组,但可以是其他任何类型(可以将数组作为结构或对象组成部分返回)
按值传递的机制:
给函数传递变元(参数)时,变元(参数)值不会直接传递给函数,而是先制作变元(参数)值的副/本,存储在栈上,在使这个副本可用于函数,而不是使用初始值
使用数组作为函数实参 1:
#include <iostream>
using namespace std;
string valueNames[] = {"体力", "智力", "魅力", "道德", "气质"};
//函数定义
void input(int [], int);
void Print(int [], int);
int main()
{
int values[5];
input(values, sizeof(values) / sizeof(int));
Print(values, 5);
return 0;
}
//函数实现
void input(int values[], int length)
{
if(length > 5)
{
cout << "数组长度只能是5以内" << endl;
return;
}
for(int i = 0; i < length; i++)
{
cout << valueNames[i] << ":";
cin >> values[i];
}
}
void Print(int values[], int length)
{
for(int i = 0; i < length; i++)
{
cout << valueNames[i] << ":" << values[i] << endl;
}
}
注:
- 数组作为函数实参时,只传递数组的地址(首地址),并不传递整个数组空间
- 当用数组名作为实参调用函数时,数组首地址指针就被传递到函数中
使用数组作为函数实参 2:
使用数组区间的函数
void show(const int *, const int *);
int main()
{
int valueArray[] = {90, 56, 67, 89, 100};
show(valueArray, valueArray + 4);
}
void show(const int * begin, const int * end)
{
for(const int *ptr = begin; ptr <= end; ptr++)
{
cout << *ptr << ",";
}
}
使用数组作为函数实参 3:
使用二维数组作参数
#include <iostream>
using namespace std;
//函数声明:
void show(const double (*)[5], int);
int main()
{
double powers[3][5] = {
{45, 5, 55, 66, 224},
{23, 23, 234, 45, 45},
{34, 56, 34, 27, 67}
};
show(powers, 3);
}
//函数实现
void show(const double (*arrs)[5], int length)
{
for(int i = 0; i < length; i++)
{
for(int j = 0; j < 5; j++)
{
cout << arrs[i][j] << "\t";
}
cout << "\n";
}
}
函数指针
函数地址:函数的地址是存储其机器语言代码的内存开始地址
好处:可以在不同的时间使用不同的函数
函数指针的声明:
//函数原型
double sum(double, double);
//函数指针声明
double (*ptrSum)(double, double)
注:
- 该语句声明了一个指针ptrSum,指向一个函数
- double *ptrSum(double, double) 不是函数指针,而是:声明了一个函数ptrSum,返回double *类型
示例:
#include <iostream>
using namespace std;
//函数声明:
int power(int, int);
int main()
{
//声明函数指针 - ptrPower
int (*ptrPower)(int, int);
//让声明的函数指针指向函数,以便调用
ptrPower = power;
cout << power(3, 4);
//cout << (*ptrPower)(3, 4);
}
//函数实现
int power(int num1, int num2)
{
int result = 1;
for(int i = 0; i < num2; i++)
{
result *= num1;
}
return result;
}
函数指针应用
使用函数指针实现加减乘除运算:
double addition(double, double)
double subtraction(double, double)
double multiplication(double, double)
double division(double, double)
double (*ptrCalc)(double, double)
#include <iostream>
#include "GzDemo.h"
using namespace std;
//函数声明:
double addition(double, double);//加
double subtraction(double, double);//减
double multiplication(double, double);//乘
double division(double, double);//除
//打印计算结果
void print_result(double(*)(double, double), double, double);
int power(int, int);
int main()
{
//定义函数指针
double (*ptrCalc)(double, double);
double num1 = 0, num2 = 0;
char op;
cout << "请输入两个操作数:";
cin >> num1 >> num2;
cout << "请输入运算符:";
cin >> op;
switch(op)
{
case '+'://调用加法函数
ptrCalc = addition;
break;
case '-'://调用减法函数
ptrCalc = subtraction;
break;
case '*'://调用乘法函数
ptrCalc = multiplication;
break;
case '/'://调用除法函数
ptrCalc = division;
break;
}
//调用
print_result(ptrCalc, num1, num2);
}
//函数实现
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 num1 / num2;
}
//打印计算结果
void print_result(double(*ptrCalc)(double, double), double num1, double num2)
{
//调用函数,打印结果
double result = ptrCalc(num1, num2);
cout << "运算结果为:" << result << endl;
}
注:
- C++中可以使用auto ptrFunc = addition;自动推断类型(自动推断类型需要确保变量与初值类型一致)
- 可以使用typedef简化声明:typedef double(*ptrCalc)(double, double) ptrCalc ptrFunc;