C++复习(三)——函数与编译预处理
一、函数
1. 函数基本
1. 定义格式
类型标识符 函数名(参数表)
{
函数体
}
int max(int a,int*p)
{
int c;
if (a>b) c=a;
else c=b;
return c;
}
形参的数据类型应与实参类型相同
函数的返回值的类型由函数类型决定,不由返回值自身的数据类型决定。
函数只能有一个返回值,可以有多个reeturn语句,也可以没有return语句,但是每次调用函数只能执行一句。
2. 函数调用时的传参分析
- 从main函数开始执行,执行到有函数语句的位置则停止mian函数的执行
- 跳转到执行自定义的函数,将main函数入栈封存
- 执行完函数之后返回继续执行main函数,同时将函数运行时,形参分配到的空间回收
函数内定义的参数无法在函数之外被访问
3. 函数的嵌套调用
在函数体内调用其他函数时:被调用函数必须在主调函数之前定义或者在主调函数之前添加函数原型声明语句
函数原型声明:类型标识符 函数名(参数表)
。
4. 引用:变量的别名。
不会为别名分配额外的内存,而是与原变量使用同一块内存
格式:
类型标识符 &引用变量名 = 变量名
例:j是i的引用
int i=0;
int &j=i;
注意:
- 引用定义时要用一个已定义的变量初始化,即
int &j=i
- 不能定义引用的引用
- 使用
const
修饰引用,则引用无法重新赋值,但是原变量可以
引用作为函数参数,可是实现对实参的改变,不会因为函数执行完而被清除
例:用引用实现a,b
值交换的函数
float swap(float &x,float&y)
{
float t;
t =x;
x=y;
y=x
return0;
}
int main()
{
int a=10,b=12;
cout <<"交换:"<<"a="<<a<<'\t<<"b="<<b<<endl;
swap(a,b)
cout <<"交换后:"<<"a="<<a<<'\t<<"b="<<b<<endl;
}
结果:
交换前:a=10 b=12
交换后:a=12 b=10;
5. 递归函数
类型标识符 函数名(参数表)
{
函数体
return 函数名(参数表)
}
例:计算阶乘
int jiecheng(int n)
{
int y;
if (n==1)
y=1;
else
y=n*jiecheng(n-1);
return y;
}
6. 内联函数
函数定义时在类型标识符前加inline
,由编译器决定
7. 函数重载
函数可以有相同的函数名,通过参数类型与参数个数区分
8. 带有默认参数的函数
先定义所有没有缺省值的参数,再定义有缺省值的参数(有缺省值的从右往左)
2. 作用域与存储类
1. 作用域
C++中的作用域:块作用域、文件作用域、函数原型作用域、函数作用域和类的作用域。
块作用域:用{}
包裹,块内说明的标识符,只能在该块内引用。在块作用域内定义的变量为局部变量
文件作用域:
函数原型作用域:在函数原型的参数表。它从其说明处开始,到函数原型说明的结束处结束。此时说明的标识符与函数调用和定义无关。
不同的函数可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。
2. 存储类
1.:
- 程序区用于存放程序代码
- 静态存储区用于存放全局变量和静态局部变量
- 动态存储区用来存放局部变量
2. 存储方式
静态存储:在文件运行时有固定的空间,直到整个文件运行结束才被回收
作用域
动态存储:在程序运行时根据需要分配空间,函数运行结束就立即回收空间。
3. 变量类(按作用域)
局部变量:在一个函数内部定义的变量或在一个块中定义的变量称为局部变量,不同作用域的局部变量可以使用相同的标识符。变量名相同,局部更优先。
全局变量:在函数体外定义的变量,作用域为文件作用域,即整个文件都可以使用该变量。缺省的作用范围为定义的位置到文件结束。局部变量与全局变量重名时,局部变量优先。
用作用域运算符::
引用与局部变量同名的全局变量。
4.:
1.动态局部变量(auto)没有赋值时为随机值。程序执行到变量定义时为其分配空间,当执行到变量作用域结束时回收空间。
2.static局部变量:在第一次执行到定义语句时为其分配空间,之后不会回收空间,直到程序结束。
3.register变量
只有形参和auto变量可以声明为register变量。
不能定义过多register变量
局部static变量不能定义为register变量
register变量由编译器决定(同内联函数)。
4.extern型变量
extern
关键字由于扩展全局变量作用域
用static
修饰全局变量,全局变量不能被其他文件引用
5. 内部与外部函数
- 内部函数:只能在文件内部使用,用
static
修饰 - 外部函数:可以被其他文件引用,用
extern
修饰
ister变量由编译器决定(同内联函数)。
4.extern型变量
extern
关键字由于扩展全局变量作用域
用static
修饰全局变量,全局变量不能被其他文件引用
5. 内部与外部函数
- 内部函数:只能在文件内部使用,用
static
修饰 - 外部函数:可以被其他文件引用,用
extern
修饰