C++ Primer Plus 学习笔记(函数)(二)

1. 函数和结构

为结构编写函数比为数组辨析额函数要简单得多。虽然结构变量和数组一样,都可以存储多个数据项,但涉及到函数时,结构变量的行为更接近于基本的单值变量。也就是说,与数组不同,结构将其数据组合成单个实体或数据对象,该实体被视为一个整体。可以将结构按值传递,这时函数将使用原始结构的副本。另外,函数可以返回结构。与数组名就是数组第一个元素的地址不同的是,结构名只是结构的名称,要获得结构的地址,必须使用地址运算符 & 。

struct travel_time
{
    int hours;
    int mins;
};


travel_time sum(travel_time t1, travel_time t2)
{
    travel_time total;
    total.mins = (t1.mins + t2.mins) % Mins_per_hr;
    total.hours = (t1.hours + t2.hours) +
        (t1.mins + t2.mins) / Mins_per_hr;
    return total;
}

2. 函数和 string 对象

虽然 C-风格字符串和 string 对象的用途几乎相同,但与数组相比,string 对象与结构更相似。可以将结构作为完整的实体传递给函数,也可以将对象作为完整的实体进行传递。如果需要多个字符串,可以声明一个 string 对象数组,而不是二维 char 数组。

void display(const string sa[], int n)
{
    for (int i = 0; i < n; i++)
        cout << i + 1 << ": " << sa[i] << endl;
}

3. 函数和 array 对象

在 C++ 中,类对象是基于结构的,因此结构编程方面的有些考虑因素也适用于类。比如,可以按值将对象传递给函数,在这种情况下,函数处理的是原始对象的副本。另外,也可以传递指向对象的指针,这让函数能够操作原始对象。

void fill(array<double, Seasons> * pa)
{
    for (int i = 0; i < Seasons; i++)
    {
        cout << "Enter " << Snames[i] << " expenses: ";
        cin >> (*pa)[i];
    }
}

void show(array<double, Seasons> da)
{
    double total = 0.0;
    cout << "\nEXPENSES\n";
    for (int i = 0; i < Seasons; i++)
    {
        cout << Snames[i] << ": $" << da[i] << endl;
        total += da[i];
    }
    cout << "Total Expenses: $" << total << endl;
}

4. 递归

C++ 函数可以调用自己(然而,与 C 语言不同的是, C++ 不允许 main() 调用自己),这种功能被称为递归。递归在特定的编程(例如人工智能)中是一种重要的工具。

如果递归函数调用自己,则被调用的函数也将调用自己,这将无线循环下去,除非代码中包含终止调用链的内容。通常的方法将递归调用放在 if 语句中。例如 void 类型的递归函数 recurs() 的代码如下:

void recurs(argumentlist)
{
    statements1
    if (test)
        recurs(arguments)
    statements2
}

test 最终将为 false,调用链将断开。

5. 函数指针

基础知识

假设要设计一个名为 estimate() 的函数,估算编写指定行数的代码所需的时间,并且希望不同的程序员都将使用该函数。对于所用的用户来说,estimate() 中一部分代码都是相同的,但该函数允许每个程序员提供自己的算法来估算时间,为实现这种目标,采用的机制是,将程序员要使用的算法函数的地址传递给 estimate() 。为此,必须完成下面的工作:

  • 获取函数的地址;
  • 声明一个函数指针;
  • 使用函数指针来调用函数。
获取函数地址

只要使用函数名即可,也就是说,如果 think() 是一个函数,则 think 就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。

声明函数指针

声明指向某种数据类型的指针时,必须制定指针指向的类型。声明指向函数的指针时,也必须指定指针指向的函数类型。
假设有如下原型:

double pam(int);

则正确的指针类型声明如下:

double (*pf)(int);

pf 指向一个需要一个 int 参数,并返回 double 类型的函数。double *pf(int) 意味着 pf() 是一个返回指针的函数;而 (*pf)(int) 意味着 pf 是一个指向函数的指针。

正确声明 pf 后,便可以将相应函数的地址赋给它:

double pam(int);
double (*pf)(int);
pf = pam;

注意,pam() 的特征表和返回类型必须与 pf 相同。

使用指针来调用函数

(*pf) 扮演的角色与函数名相同,因此使用 (*pf) 时,只需将它看做函数名即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值