老九学堂 学习C++ 第六天

函数

自定义函数的完整写法:

在这里插入图片描述
注:

  1. 函数原型与函数定义的头部类似,最后以分号结尾
  2. 函数原型中的参数名称可以省略,只写参数类型
  3. 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;
    }
}

注:

  1. 数组作为函数实参时,只传递数组的地址(首地址),并不传递整个数组空间
  2. 当用数组名作为实参调用函数时,数组首地址指针就被传递到函数中

使用数组作为函数实参 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)

注:

  1. 该语句声明了一个指针ptrSum,指向一个函数
  2. 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;
}

注:

  1. C++中可以使用auto ptrFunc = addition;自动推断类型(自动推断类型需要确保变量与初值类型一致)
  2. 可以使用typedef简化声明:typedef double(*ptrCalc)(double, double) ptrCalc ptrFunc;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值