内联函数
-
内联函数 使用关键字inline定义
-
对于规模较小,调用频繁的函数 ,可以将其声明为内联函数,提高程序执行效率
-
内联函数是在编译时将被调函数嵌入每一个函数调用处,节省了参数传递、控制转移等开销
-
内联函数的语法为
-
inline 类型说明符 函数名(参数及类型表)
-
在定义内联函数时,通常时省去函数的声明,而是在声明位置直接给出函数的定义
#include <iostream> using namespace std; inline int add(int a, int b) // 内联函数 { return a + b; } int main() { int a,b,c; a = 10; b = 20; c = add(a,b); cout << "a" << "+" << "b" << "=" << c << endl; return 0; }
内联函数在运行时,与普通函数的结果一样,但是在编译时将add函数嵌入相应位置,减少了运行时的函数调用,但内联函数的使用也会使编译后的可执行程序变大。
-
一般只有简单的函数才能成为内联函数
-
如果函数比较复杂,如含有循环,分支等结构,即使声明为内联函数,编译器也会将其当成普通函数对待。
函数重载
-
在C语言中因为系统是通过名字来区分各个函数的,所以不能有两个函数具有相同的名字。
-
在C++中可以定义多个同名函数,只要他们的形参个数或类型不完全一样就可以,编译程序根据实参与形参的类型及个数自动确定调用哪个同名函数,这就是函数重载
int max(int x,int y); double max(double x, double y); int main() { int a = 2; int b = 3; double c = 6.0; double e = 4.0; int x = max(a,b); double y = max(c,e); cout << a << "和" << b << "的最大值是" << x << endl; cout << c << "和" << e << "的最大值是" << y << endl; return 0; } int max(int x, int y) { if (x >= y) return x; else return y; } double max(double x,double y) { if (x >= y) return x; else return y; }
注意,在函数重载中,要避免二义性。
// 在上面的程序中不能出现以下有歧义的代码 int x = 1; double y = 3.5; max(x,y); // 此代码就有二义性,要避免这种情况
函数默认值
在C++中可以为函数参数指定默认参数,若参数不够,用函数的默认参数来补足缺少的实参
double pow(int n=2,int x=1); int main() { int a = 2; int b = 4; cout << pow(a,b) << endl; cout << pow(b) << endl; cout << pow() << endl; return 0; } double pow(int n,int x) { int sum = 1; for (int i = 0; i < x; i++) { sum *= n; } return sum; }
函数默认值的二义性
// 在函数重载时会出现二义性的问题 int add(int x,int y); double add(int x,double y); int main() { int a = 10; int b = 20; double c = 30; int x = add(a,b); double y = add(a,c); // cout << add(a) << endl; !!二义性!! cout << x << endl; cout << y << endl; return 0; } int add(int x,int y) { return x+y; } double add(int x,double y) { return x+y; }
函数指针
专门用于保存函数地址的指针变量,然后使用这个指针变量调用函数,这种指针变量称为函数指针变量,简称函数之指针
// 函数类型 (*函数指针名)(参数类型表);
函数指针的应用
int add(int x,int y); int sub(int x,int y); int mul(int x,int y); int Division(int x,int y); int main() { int n ; int (*p[4])(int x,int y); p[0] = add; p[1] = sub; p[2] = mul; p[3] = Division; for (int i = 0; i < 4; i++) { cout << p[i](10,5) << endl; // 使用函数指针调用函数 } return 0; } int add(int x,int y) { return x+y; } int sub(int x,int y) { return x-y; } int mul(int x,int y) { return x*y; }int Division(int x,int y) { if(y == 0) return 0; else return x+y; }
命令行参数
C++主函数 main也可以带有参数,称为命令行参数,通过改参数可以在命令提示符下运行程序时为程序提供参数
int main(int argc,char *argv[]) // 第一个参数板寸命令行的参数个数,是整型数据,由于程序名本身也被当做一个参数,因此它至少为1 // 第二个参数argv是指向字符的指针数组,用来接收实参(字符串)。argv[0]就是程序名,argv[1]就是第一个参数
#include <iostream> using namespace std; int main(int argc, char* argv[]) { int a1, a2, a3; char c; if (argc != 4) { cout << "参数数量不对。\n"; exit(0); } a1 = atoi(argv[1]); a2 = atoi(argv[3]); c = argv[2][0]; switch (c) { case '+': a3 = a1 + a2; break; case '-': a3 = a1 - a2; break; case '*': a3 = a1 * a2; break; case '/': a3 = a1 / a2; break; default: exit(0); } cout << a1 << "\t" << a3 << endl; getchar(); return 0; }
下图是利用cmd运行后缀为exe的可执行文件并且填入参数得到运行结果
变量的存储
1.内部变量(局部变量)
函数内部定义的变量是局部变量,它只在该函数范围内有效。在函数外不能使用这些变量
2.外部变量(全局变量)
全局变量不属于任何一个函数,其作用域是从全局变量定义开始的,到本文件结束为止。全局变量可被作用域内的所有函数直接引用。
变量的存储类别
1.静态变量
static 数据类型 变量名;
如果变量被定义为静态的,则在执行的过程中,变量始终存在,但在其他函数中不能引用他们。也就是说,内部静态变量的作用域仍然是在定义该变量的函数中。
-
如果对静态变量不初始化,则自动初始化为0(整型或实型)或 '\0' (字符型)。
-
每次调用他们所在函数时,不再重新赋值,保留上次调用结束时的值
int Factorial(int n); int main() { int a = 4; for (int i = 1; i <= a; ++i) { cout << i << "! = " << Factorial(i) <<endl; } /* 次数 static int f的值 * 1 1*1 * 2 1*2 * 3 2*3 * 4 2*3*4 * */ return 0; } int Factorial(int n) { static int f = 1; // 静态变量,初始化为1,调用时不再重新初始化 f*=n; return f; // 离开函数后,静态变量f的值被保存 }
2.自动变量
auto 数据类型 变量名;
-
如果在定义变量时既不指定static也不指定auto,则默认为自动变量。自动变量属于动态存储方式。
-
在函数中定义的自动变量只在该函数内有效。
-
函数被调用时分配内存空间,调用结束就释放
-
自动变量如果不初始化,其值是不确定的。如果初始化,则赋初值是在调用时进行的,且每调用一次都要重新赋一次初值