【C++】C++自学旅程(3):函数与预处理
C++当然也是有函数的,而且跟C基本一致,但增加了很多新的特性。关于函数的定义、声明、调用等跟C一致的内容我就不说了,下面只记载一下学到的新东西。
一、函数重载
简单的说,就是函数名相同、函数参数表不同(参数类型或者个数不同)的几个函数构成重载,系统可根据参数自动判定调用哪个函数。如:
int max(int a, int b) { ...... } double max(double a, double b, double c) { ...... } ......
但注意,函数类型并不是决定函数重载是否正确的条件,也就是说参数表相同,函数名相同,只有函数类型不同,是不能正确构成重载的,如下面就是错误的:
int max(int, int) { ...... } double max(int, int) { ...... }
系统无法知道到底调用哪一个。
所以,函数重载:
1、函数名相同;2、形参个数或形参类型至少有一个不相同。
二、带默认参数的函数
int add(int a=10, int b=10, int c=10) { return a+b+c; }
这样,如果调用时是:add(),得出的结果就是30,若是add(2),那么得出结果是22,以此类推……
只是要注意的是,默认形参只能放在靠右,如以下几种是错误的:
int add(int a=1, int b=2, int c); int add(int a=1; int b, int c=3); ......
另外值得一提的是,带默认参数的函数和函数重载不要一起用,容易搞混。
三、内联函数
inline 函数类型 函数名(形参列表) 用这种方法来减少频繁调用函数的开销。
要求:
不能包括复杂的控制语句,如循环语句和switch语句;不能包括递归调用语句;不能有太多的函数体语句。
不满足要求的会按照一般函数调用执行。
四、嵌套调用和递归调用
旧东西,多做做题可能会理解得好一点。
五、预处理
预处理包括:宏定义、文件包含。需要讲的有以下两点:
1、文件包含中,< > 和 " "的区别:
< >,系统会去存放C++的系统目录中去寻找,没有找到就会报错,适合系统提供的库;" "中可以写绝对路径,如果没有写绝对路径,系统会先去当前目录找,如果没有找到则去系统目录,还没有找到就报错,适合自己写的头文件。
2、条件编译
满足条件编译部分,主要使用于头文件中避免因头文件的多次引用而造成对变量的重复定义。主要有以下几种形式:
①
#ifdef 标识符 程序段1 #else 程序段2 #endif
前面#define了标识符则编译程序段1,否则编译2。
②
#ifndef 标识符 程序段1 #else 程序段2 #endif
与上一种相反。
③
#if 表达式 程序段1 #else 程序段2 #endif
如字面。
使用条件编译可以使目标程序变小,运行时间变短。条件预编译命令问题或算法的解决方案增多,有助于选择合适的解决方案。