1、函数的声明与调用
函数在面向对象的程序设计中是对功能的抽象。其语法形式:
类型标识符函数名(含类型说明的形式参数表){语句序列},函数的返回值用return给出,其中类型标识符在没有返回值的情况下写成void,则不谢return,形式参数被初始化的内部变量,寿命和可见性仅限于函数内部。
函数的调用前先声明函数原型,调用形式:函数名(实参列表)。可以嵌套调用,但是不能嵌套定义。
例如:
#include <iostream>
using namespace std;
double power (double x, int n);//函数声明,也可以出现在main函数中调用该函数之前。
int main()
{
cout << "5 to the power 2 is " << power(5,2) << endl;
//函数调用作为一个表达式出现在输出语句中。
}
double power (double x, int n)
{
double val = 1.0;
while (n--)
val *= x;
return(val);
}//结果:5 to the power 2 is 25
#include <iostream>
using namespace std;
int main()
{ int a,b;
int fun1(int x,int y);
cin>>a>>b;
cout<<"a、b的平方和:"<<fun1(a,b)<<endl;}
int fun1(int x,int y)
{ int fun2(int m);
return (fun2(x)+fun2(y));}
int fun2(int m)
{ return (m*m);} //运行结果:3,4 a、b的品方和:25.
递归调用
函数直接或者间接的调用自身称为递归调用。包括递推和回归。
#include <iostream>
using namespace std;
long fac(int n)//函数定义
{
long f;
if (n<0) cout<<"n<0,data error!"<<endl;
else if (n==0) f=1;
else f=fac(n-1)*n;
return(f);
}
int main()
{
long fac(int n);//函数声明
int n;
long y;
cout<<"Enter a positive integer:";
cin>>n;
y=fac(n);
cout<<n<<"!="<<y<<endl;
} //运行结果:Enter a position interger:8 8!=40320
函数的传递机制
函数形参不占任何内存空间,只有在被调用时才分配形参的存储单元;实参可以是常量、变量或者表达式;实参类型必须和形参相符合;传递时是传递参数值,即单向传递。
#include<iostream>
using namespace std;
void Swap(int a, int b); //改成void Swap(int &a, int &b);即可,a和b即将成为某个变量的别名。
int main()
{
int x(5), y(10);
cout<<"x="<<x<<" y="<<y<<endl;
Swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
return 0;
}
void Swap(int a, int b)//交换a,b 改成void Swap(int &a, int &b);即可
{
int t;
t=a;
a=b;
b=t;
}//这个程序没有完成希望的交换功能,因为函数传递仅仅是数值,在形式结合之后,形参和实参的关系就切断了,
为了实现成功的交换,可以采用引用做形参,引用就是标识符的别名,例如int i,j; int &ri=i; ri=j;就相当于i=j。声明一个引用时,必须同时对它进行初始化,使他指向一个已经存在的对象,一旦引用被初始化后,就不能改为指向其他对象。
内联函数兼顾了程序的结构和运行开销两个方面,编译时在调用处用函数体进行替换,节省了参数传递和控制转移等开销。内敛函数体内不能有循环和switch语句,而且声明必须出现在内联函数第一次被调用之前,不能进行异常接口的声明。声明时使用inline关键字。例如:
#include<iostream>
using namespace std;
inline double CalArea(double radius) //内联函数,计算圆的面积
{ return 3.14*radius*radius;}
int main()
{ double r(3.0); //r是圆的半径
double area;
area=CalArea(r);
//调用内联函数求圆的面积,编译时此处被替换为CalArea函数体语句,不用去该函数的函数体计算再回调结果
cout<<area<<endl;}
默认形参值的作用
有默认形参值的函数在调用时若给出实参就采用实参的值,否则就用形参的值。
int add(int x=5,int y=6)
{ return x+y; }
int main()
{ add(10,20);//10+20
add(10); //10+6
add(); //5+6 }
int add(int x,int y=5,int z=6);//正确
int add(int x=6,int y=5,int z);//错误
int add(int x=5,int y,int z=6);//错误
int add(int a=6,int b=6);//函数原型 int add(int a=6,int b=6){return a+b;}//函数体实现
int main(){ int main(){add();//调用在实现之后}
add();//函数调用}
int add(int a,int b){return a+b;}//函数体实现
int add(int x=1,int y=2);
int main()
{ int add(int x=3,int y=4);
add();//使用局部默认形参值(实现3+4)
}
void fun()
{ ...
add();//使用全局默认形参值(实现1+2)
}
#include<iostream>
using namespace std;
struct complex
{
double real;
double imaginary;
};
int main()
{
int m, n;
double x, y;
complex c1, c2, c3;
int add(int m, int n);
double add(double x, double y);
complex add(complex c1, complex c2);
cout<<"Enter two integer: ";
cin>>m>>n;
cout<<"integer "<<m<<'+'<<n<<"="<<add(m,n)<<endl;
cout<<"Enter two real number: ";
cin>>x>>y;
cout<<"real number "<<x<<'+'<<y<<"= "<<add(x,y)<<endl;
cout<<"Enter the first complex number: ";
cin>>c1.real>>c1.imaginary;
cout<<"Enter the second complex number: ";
cin>>c2.real>>c2.imaginary;
c3=add(c1,c2);
cout<<"complex number ("<<c1.real<<','<<c1.imaginary<<")+("
<<c2.real<<','<<c2.imaginary<<")= ("<<c3.real<<','<<c3.imaginary<<")\n";
}
int add(int m, int n)
{ return m+n; }
double add(double x, double y)
{ return x+y; }
complex add(complex c1, complex c2)
{
complex c;
c.real=c1.real+c2.real;
c.imaginary=c1.imaginary+c2.imaginary;
return c;
}
#include<iostream>
#include<cmath>
using namespace std;
const double pi(3.14159265);
int main()
{
double a,b;
cin>>a;
b=a*pi/180;
cout<<"sin("<<a<<")="<<sin(b)<<endl;
cout<<"cos("<<a<<")="<<cos(b)<<endl;
cout<<"tan("<<a<<")="<<tan(b)<<endl;
}
30
sin(30)=0.5
cos(30)=0.866025
tan(30)=0.57735
查联机帮助——VC++6.0联机帮助的使用方法:
help/Contents
->(“活动子集”栏)Visual C++
Documentation
->Visual C++ Documentation
->Using Visual C++
-> Visual C++ Programmer's Guide
-> Run-Time Library Reference
->Run Time Routines by Category
-> Run Time Routines by Category