函数

自定义函数的完整写法:


注:

  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()
{//声明函数指针 - ptrPowerint (*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;

老九学堂 学习C++ 第六天相关推荐

  1. 老九学堂 学习 C++ 第七、八天

    7.1 内联函数 内联(inline)函数:是C++为提高程序运行速度所做的一项改进:与常规函数的区别不在于编写方式,而在于被调用时的运行机制不同:编译使用函数代码替换 函数调用. 使用建议:如果执行 ...

  2. 老九学堂 学习C++ 第十天

    10继承 10.1 概念: 所谓 "继承(inheritance)" 就是在一个已经存在的类基础上,再建立一个新类 从已有的类派生出新的类,派生类就继承了原有类(基类)的特征,包括 ...

  3. 【老九学堂】【C++】数组与指针

    不知道在通过前面的内容学习后,是否有很多小伙伴都会认为数组和指针是等价的,数组名表示数组的首地址呢?不幸的是,这是一种非常危险的想法,并不完全正确,前面我们将数组和指针等价起来是为了方便大家理解(在大 ...

  4. 老九学堂之分布式设计教材

    老九学堂之分布式设计教材 作者:老九-技术大黍 原文:分布式系统设计教材 社交:知乎 公众号:老九学堂(新人有惊喜) 特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权 前言 本文由老 ...

  5. 【老九学堂】【C++】位运算符

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型 ...

  6. 【老九学堂】【C++】C++的发展史

    为了让小伙伴们在学习过程中,能收获更多的知识,达到真正的零基础入门和深入了解C++,老九君特地收集了有关C++发展相关的一些资料供大家查阅和学习: C++语言发展大概可以分为三个阶段: 第一阶段从80 ...

  7. 【老九学堂】【初识C语言】C语言中的运算符

    1运算符和表达式 C语言运算符是说明特定操作的符号,它是构造C语言表达式的工具.C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理.除了常见的三大类,算术运算符.关系 ...

  8. 【老九学堂】【初识C语言】C语言保留字(关键字)详解

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  9. 【老九学堂】【初识C语言】二维数组

    一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量.在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量. ...

最新文章

  1. 设计模式05-建造者模式
  2. accept函数与TCP三次握手
  3. java 矩阵求逆_java实现的顺时针/逆时针打印矩阵操作示例
  4. 集体奔赴农业战场 互联网巨头对话中国农民丰收节交易会
  5. 能源局将提高光伏“领跑者”项目技术指标
  6. 更新和插入的并发问题_mysql经典面试题:如何读写分离?主从原理是啥?同步的延时问题...
  7. CodeMirror动态加载和表单提交
  8. android 修改cpu信息,从Android源码修改cpu信息
  9. PHPWord 表格居中和合并单元格
  10. 分享一下自己收集到的真实用户的UA
  11. 记录一次使用LKAdoc时出现的很low很low很low的问题
  12. 听说你还在纠结自己没访问量?成不了“博客专家”?
  13. PHP计算一年有多少周,每周开始日期和结束日期
  14. 移动IM产品发展史及趋势预测
  15. 剪枝论文一(Network Slimming)
  16. 微信小程序包体积过大解决方法
  17. ajax modal 关闭,iview中Modal对话框提交控制关闭
  18. Excel VBA高级编程 - 根据关键词实时筛选,自动生成下拉菜单
  19. RESS南方不动产权籍调查测绘软件,助力房地一体化测量(RESS V20)
  20. python中copy什么意思_python中copy与deepcopy的区别

热门文章

  1. Camera两种快门方式区别
  2. 案例 | 重新定义“一个人的小酒”,RIO如何微醺营销击中00后的心?
  3. 一个1-23二进制搭建方法
  4. 产品经理在公司一般都是干什么?
  5. 佛山市政携手企企通,打造高效协同的云端极速供应链
  6. linux内核配置cpu相关,Linux内核配置
  7. 【人工智能 AI】机器学习快速入门教程(Google)
  8. 计算机运行命令如何关闭应用程序,如何禁止电脑中某些程序的运行
  9. C语言 线程的回收与子线程返回值的接收
  10. 有哪些比较好用的黄页网站?