函数是一个能够完成某个独立功能的程序模块。
一个c++程序至少且只能包含一个main()函数。main()函数是整个程序的入口,通过在main()函数中调用其他函数,这些函数还可以相互调用,甚至自己调用自己来实现整个程序的功能。
c++中的函数分为两类,一类是系统提供的标准函数,即库函数。一类是系统没有提供,用户根据待求解问题的需要自己定义的函数。
函数类型 函数名([形参名])
{
函数体
}
**函数名:**是一个符合 C++语法要求的标识符,命名规则与变量的命名规则相同。
**形参表:**关于函数参数的个数、名称和类型的列表。在函数定义时进行说明,因此成为形式参数。形参中参数个数多于1时,用 “,"分开。函数可以没有形参,但是()不能缺省。
**函数体:**通过一条或多条语句完成函数的功能。
**函数类型:**包含有值函数和无值函数。有值函数中,return <表达式> 返回函数的值,<表达式>的类型要与函数类型相一致。无值函数,定义函数时,函数类型要声明为 void 类型,如 void Add(),在函数体内不需要 return 语句,如果有,则其后的表达式为空,表示仅仅从函数返回。
如果没有说明函数类型,系统默认为 int 型。
无值函数:
void Add(int x, int y)
{
cout<
在函数体内直接将两个数的和输出到屏幕上,不需要返回值,定义为无值函数。
在一个函数里对一个已经定义了的函数调用格式为:
函数名([<实参表>])
实参表是调用函数时,实际传递给函数的参数列表, 实参的个数,类型,顺序要和形参一一对应。在函数调用时,将实参的值传递给相应的形参。
#include
const double PI=3.14;
using namespace std;
double Area(double x)
{
double s;
s=PI*x*x;
return s;
}
int main()
{
double r,ss;
cout<<"请输入圆的半径:";
cin>>r;
ss=Area(r);
cout<<"圆的面积为:"<
函数调用过程:
提示:
在调用函数之前,必须先定义这个函数。如果在函数调用之后再进行函数定义的话,需要在调用之前给出函数原型,也成为函数声明。编译系统根据函数原型确定函数调用时的函数名、参数个数、类型以及返回值类型。
函数原型的一般格式为:
类型 函数名(形参说明表);
函数原型就是函数头加上分号,函数原型中,形参名可以缺省。
double Area(double x);
替换为:
double Area(duble);
//example
#include
using namespace std;
int Fun(int);
int main()
{
int n;
cout<<"请输入一个整数:1~10:";
cin>>n;
while(n!=0)
{
cout<>n;
}
return 0;
}
int Fun(int n)
{
int p=1;
for(int i=2;i<=n;i++)
p=p*i;
return p;
}
根据变量定义的位置和方式的不同,变量的存储类型有全局变量和局部变量。而变量的存储类型又确定变量的作用域和生存期。
代码区:存放程序中各个函数的代码。
全局数据区:保存在其中的变量的寿命是全程的,存放全局数据和静态数据。
堆区:存放程序的动态数据。
栈区:存放程序中各个函数的局部数据。
跟 C++中初始化一个栈有没有什么联系呢?(师兄强势解答)
数据结构是一种概念,定义了我们应该怎么组织数据。C++ 里面,初始化一个数组、栈、队列,是我们在程序中自定义了一种数据结构,用来存储或者操作我们程序中的数据。程序是写在 C++文件里的,文件存储在硬盘里,编译好运行时,程序被加载到计算机的内存,然后 CPU 参与运算。运行完后,数据要么从内存释放、要么存储到硬盘里。
程序运行的东西要加载到内存,怎么加载过去呢?这一部分代码也不是我们写的。
这一部分是操作系统和编译器做的,写的都是非常底层的代码,C、C++、汇编什么的。
它们有自己的管理内存的方式,比如动态数据会存储到堆区,局部数据会存储到栈区。
这个管理内存方式就是怎么组织内存中的数据,栈区就是按栈这种数据结构组织的,堆区就是按堆这种数据结构组织的。
局部变量是在函数内部定义的变量,函数的形参也是该函数的局部变量。若没有初始化,其值随机,存放在内存的栈区。
作用域:定义它的函数,其他函数不能识别和使用。
生存期:所在函数的生存期。函数被调用时,函数的局部变量在栈区中被分配空间,获得生命,函数调用结束时,局部变量在栈中的空间被释放。函数再次调用时,为局部变量重新分配空间,重新获得生命。
全局变量是在所有函数之外定义的变量,一般在程序顶部文件包含语句之后定义。若没有初始化,自动初始化为0。全局变量存储在全局数据区。
作用域:变量的定义位置开始到定义该变量的文件结束为止。全局变量是各函数公用的变量,每个函数中都可以使用和改变它的值。
生存期:全程,程序开始运行时分配空间,程序结束时释放内存。
在全局变量定义前加一个关键字 static,则该变量称为静态全局变量。作用域:定义该变量的源文件。生命周期:全程。
#include
const double PI=3.14;
double g_ss;
using namespace std;
void Area(doubel r)
{
g_ss=PI*r*r;
}
int main()
{
int r;
cout<<"请输入圆的半径: ";
cin>>r;
Area(r);
cout<<"圆的半径为:"<
**解析:**其中 g_ss是全局变量在 Area 函数中直接将圆的面积赋值给 g_ss,Area()调用结束后直接输出 g_ss 的值,此时 Area 不需要返回值,,所以被定义为 void 类型。main()函数中也只调用了 Area 函数,不需要再对 g_ss 进行赋值。
提示:
静态局部变量定义在某个函数内部,定义的格式为:
static 类型 <变量名表>;
静态局部变量兼具全局变量和局部变量的特性。
作用域:与局部变量相同。
生存期:全程。第一次调用该函数时,静态局部变量被存放在全局数据区中,如果定义没有被初始化,则被自动初始化为0(和全局变量一样)。以后再调用该函数时,不再为函数中的静态局部变量分配空间,而是自动使用上次调用后的局部变量。
#include
void Func();
using namespace std;
int main()
{
int n;
for(n=1;n<=10;n++)
Func();
return 0;
}
void Func()
{
static int s_a=0;
int b=0;
s_a++;
b++;
cout<<"s_a:"<