1.函数定义的组成:返回类型、函数名、形参列表(0个或多个参数)、函数体。函数的三要素(返回类型,函数名,形参类型)描述了函数的接口。
2.函数的返回类型不可以是数组类型或函数类型,但可以是指向数组或函数的指针。
3.形参和函数体内部定义的变量统称为局部变量。只存在于块执行期间的对象称为自动对象,形参是一种自动对象。局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且指导程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响,通过static类型去定义。
int add(int num1,int num2)
{
static int count=0;
int result=0;
result=num1+num2;
count++;
return result;
}
4.数组形参的表现形式:
void print(const int*);
void print(const int[]);
void print(const int[10]);
管理指针形参的三种常用技术:
① 要求数组本身包含一个结束标记,典型:C风格字符串,函数在处理C风格字符串时遇到空字符停止。
② 传递指向数组首元素和尾元素的指针。
③ 专门定义一个表示数组大小的形参。
传递多维数组:
Note:
int *matrix[10]; //10个指针构成的数组
int (*matrix)[10]; //指向含有10个整数的数组的指针
5.函数的重载:同一作用域内的几个函数名字相同但形参列表不同。
①:一个拥有顶层const的形参无法和另一个没有顶层constant的形参区分开来。
Record lookup(Phone);
Record lookup(const Phone); //重复声明了Record lookup(Phone)
Record lookup(Phone*);
Record lookup(Phone* const); //重复声明了Record lookup(Phone*)
②:如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数的重载,此时的const是底层的。
Record lookup(Account&); //函数作用于Account的引用
Record lookup(const Account&); //新函数,函数作用于常量引用
6.内联函数:用于优化规模较小、流程直接、频繁调用的函数,函数前加inline。
7.调试帮助:用到两个预处理功能 assert 和 NDEBUG。
assert是一种预处理宏,定义在cassert头文件中,常用于检查“不能发生”的条件。
assert (expr); //对expr求值,如果表达式为假,assert输出信息并终止程序执行。
NDEBUG 预处理变量,定义NDEBUG能避免检查各种条件所需的运行时开销。如果定义了NDEBUG,则assert什么也不做,一般默认状态没有定义NDEBUG。
8.参数的传递方式:①传值参数:数值和指针;②传引用参数(通过使用引用参数,允许函数改变一个或多个实参的值)