第9章 C++函数
9.1 函数 function
9.1.1函数
可以讲一段C++语句包装换成一个函数,如:
//定义函数sayHello()
void sayHello( )//定义函数sayHello( )
{
cout<<"Hello world!"<<endl;
}这里就定义了一个sayHello()函数
9.1.2 函数调用
可以在别的地方调用这个sayHello()函数,如:
int main( )
{
cout<<"begin…"<<endl;
sayHello( );//调用函数sayHello()
cout <<"end…"<< endl;
return 0;
}这里main()函数完成了对sayHello()函数的调用,有时候称main()函数为调用者(caller)
9.1.3使用调试器观察函数的调用
P135-137
9.1.4函数参数parameter
函数可以包含参数,即函数参数
例:输出圆周
// 9.1.4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
//根据给定的半径输出圆周长
void printCircumference(double radius)
{
double c;
c = 2*3.14*radius;
cout<<"半径:"<<radius<<endl;
cout<<"周长:"<<c<<endl;
}
int main()
{
//指定半径,调用printCircumference输出圆周长
printCircumference(100.1);
return 0;
}
其中double radius叫做形参,100.1叫做实参
注意形参要和实参类型一致
形参的数目也必须和实参一样
printCircumference(); //error 函数不接受0个参数
printCircumference(100.1); //error,不接受2个参数
9.1.5返回值(return value)
上述sayHello和printCircumference都没有返回值。
他们返回值声明成void型。
关键字return用以结束当前函数流程 直接返回,语法:
return;
return 返回值;
如果一个函数具有返回值,那就必须使用到return函数,让他返回一个指定类型的值。
9.2 函数原型function prototype
9.2.1 函数原型
又称函数声明function declaration
例:
// 9.2.1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
//函数声明
double getCircumference(double radius);
int main()
{
//函数调用
double c = getCircumference(100.1);
cout<<"周长"<<c<<endl;
return 0;
}
//函数定义
double getCircumference(double radius)
{
double c;
c = 2*3.14*radius;
return c;
}
其中函数原型(函数声明)包括3个部分:
double getCircumference(double radius);
返回值类型:如double,当函数没有返回值的时候,必须显式的标出void类型
函数名:如getCircumference,可以是任何一个合法的标识符
参数表:如double radius,参数表指定函数的参数类型及个数,参数名字可以省略不写,对于空的参数列表,可以不写,也可以写成void。
int add(int a,int b); //ok,2个参数
函数原型可以重复出现,除非被调用,否则函数原型所声明的函数不一定要有其定义。
9.2.2 main()函数
9.2.3 定义带参数的main()函数
p141
9.2.4默认参数
C++的函数可以带有默认参数,如:
// 9.2.4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
double getCircumference(double radius,double pi = 3.14) //指定pi的缺省值是3.14
{
double c;
c = 2 * pi * radius;
return c;
}
int main()
{
cout << getCircumference(100.1) <<endl;
cout << getCircumference(100.1,3.1415926) << endl;
return 0;
}
getCircumference()包含2个参数,第2个参数pi用以指定圆周率π的近似值
main()函数演示了2中调用方法,一种采用默认参数,另一组指定了pi的值
如:
getCircumference(100.1); //ok
getCircumference(100.1,3.1415926); //ok
getCircumference(100.1,3.14); //ok
getCircumference(,3.14); //error
getCircumference(); //error radius没有默认值
double getCircumference(double radius =100.1,double pi); //error默认函数必须从最右边开始
double getCircumference(double radius,double pi=radius*2);//error不能用形参做默认参数
9.2.5 可变参数
允许参数的数目是可变的
如:
int add(…)
…告诉编译器,函数的参数是可变的,,可变函数的声明与定义一般包含一个起始参数,如:
int add (int first…)或int add(frist,…)
要定义一个支持可变的函数,需要用到标准头文件<cstdang> P145
9.2.6 内联(inline)函数
p146
9.3函数重载function overload
9.3.1函数的重载
函数的重载用来解决函数名字不够用的问题。
重载可以体现在函数的参数数目和功能的不同
不能依赖返回值的不同选定同一个函数
9.3.2重载函数的调用
9.3.3安全连接(type safe linkage)
c++允许使用“extern”C””来指示某个函数是C代码实现的
9.3.4 名字重组(name mangling)
p150
9.4递归函数
9.4.1递归函数recursive function
如:
p151-p155 没仔细看
9.5 函数与指针
9.5.1指向函数的指针
如:
void (*fp)();
可以取一个函数的地址赋给函数指针,如:
fp=&foo;
在C++中,也可以忽略掉“&”,如:
fp=foo; 即完成了指针的赋值,也可以采用(*fp)(); //相当于foo(); 完成函数调用
也可以包含参数、返回值的函数指针,如:
int (*fp)(int a ,int b);
注意不同类型的函数指针不能混用,如:
int(*fp)(int a,int b) = &foo;
编译器会报错:“初始化”:无法从“void(__cdecl*)(void)”转换为“int(__cdecl*)(int,int)”
9.5.3函数与值传递
函数的形参可以是值、指针和引用
//传值方式
void foo1(int i) //i保留实际参数的值,他是实际参数的一份拷贝
//引用方式
void foo2(int &ir) //ir就指向实际参数
//传址方式
void foo3(int* ip) //ip保存实际参数值,实际参数的值是一个地址