第9章 C++函数

 

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

上述sayHelloprintCircumference都没有返回值。

他们返回值声明成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);  //ok2个参数

函数原型可以重复出现,除非被调用,否则函数原型所声明的函数不一定要有其定义。

 

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保存实际参数值,实际参数的值是一个地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值