创建函数:
定义、提供原型和调用。
1、为什么需要函数原型
原型描述了函数到编译器的接口,也就是,它将函数返回值的类型以及参数的类型和数量告诉了编译器。
c++的编程风格是将main()放在最前面,因为它通常提供了程序的整体结构。
在原型的参数列表里,可以包括变量名,也可以不包括,原型中的变量名相当于占位符,不必与函数定义中的变量名相同。
例如:
double cheer(double x);
可以写成:
void cheers(int);//只提供参数类型,列表即可
原型的功能:
仅当有意义时,原型化才会导致类型转换。
(原型不会将整数转换为结构或者指针)
在编译阶段进行的原型化被称为静态类型检查。
2、函数参数和按值传递
2.1、多个参数
在调用函数时,只需要使用逗号将这些参数分开即可。
3、函数和数组
int sum_arr{
int arr[],int n}; //函数和数组的结合使用
3.1、函数使用指针来处理数组
1、c++将数组名解释为其第一个元素的地址。
int sum=sum_arr(cookies,ArSize);
在,c++中,当用于函数头或者函数原型中, int *arr[]和int arr[ ]的含义才是相同的。他们都意味着arr是一个int 类型的指针。
谨记:
将指针(包括数组名)加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值。对于遍历数组而言,使用指针加法和数组下标时等效的。
2、将数组作为参数意味着什么
将数组作为参数可以节省复制整个数组所需的时间和内存,如果数组很大,则使用拷贝的系统开销将非常大;程序不仅需要更多的计算机内存,还需要花费时间来复制大块的数据,另一方面,使用原始数据增加了破坏数据的风险。
3、更多数组函数示例
3.1、填充数组
int fill_array(double arr[], int limit)
{
using namespace std;
double temp;
int i;
for (i = 0; i < limit; i++)
{
cout << "Enter value #" << (i + 1) << ":";
cin >> temp;
if (!cin)
{
cin.clear();
while (cin.get() != '\n')
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Bad input;input process terminated\n";
break;
}
}
else if (temp < 0)
break;
arr[i] = temp;
}
return 0;
}
3.2、显示数组及用const保护数组
为防止函数无意中修改数组的内容,可以在声明形参时使用关键字const。
举例:
void show_array(const double ar[ ],int n);
3.3、修改数组
在修改数组的函数中, 由于这个函数将修改数组的值,因此在声明ar时,不能够使用const。
4、程序说明
通过数据类型和设计适当的函数来处理数据,然后将这些函数组合成一个程序。称为自下而上的程序设计。
传统的过程性编程倾向于从上如下的程序设计,首先指定模块化设计方案,然后在研究细节。
两种方法都很有用,最终的产品都是模块化程序。
5、使用数组区间的函数
for(pt=begin;pt!=end;pt++)
{
total=total+*pt;
}
pt设置为指向要处理的第一个元素的指针,然后加入total中,然后通过递增操作来更新pt,使之指向下一个元素,当pt等于end时,将指向区间中最后一个元素后面的一个位置,循环将结束。
6、指针和const
6.1、将指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。
int age=39;
const int *pt=&age;//该声明指出,pt指向一个const int,不能使用pt来修改这个值。换句话,*pt的值为const,不能被修改。
const int **pp2;
int *p1;
const int n=13;
pp2=&p1;
*pp2=&n;
*p1=10;
仅当只有一层关系时,才可以将非const地址或指针赋给const指针。
注意:
如果数据类型本身并不是指针,则可以将const数据或者非cnost数据的地址或指针赋给const指针。
6.2、将指针本身声明为常量,这样可以防止改变指针指向的位置。
7、函数和二维数组
数组名将被视为地址,相应的形参是一个指针。
例如:
int sum(int (*ar2)[4],int size);
int sum(int ar2[ ][4],int size);
两种都是正确的表达形式,但是相比较下面的代码的可读性更强。
8、函数和结构
#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;
struct travel_time
{
int hours;
int mins;
};
const int mins_per_hr = 60;
travel_time sum(travel_time t1, travel_time t2);
void show_time(travel_time t);
int main()
{
travel_time day1 = {
5,45 };
travel_time day2 = {
4,55 };
travel_time trip = sum( day1,day2 );
cout << "Two-day total: ";
show_time(trip);
travel_time day3 = {
4,32 };
cout <<