1. 函数基础
- 函数定义包含以下部分:返回类型, 函数名, 形参列表, 函数体
- 函数的调用完成两个工作:
- 用实参初始化函数对应的形参
- 将控制权转移给被调函数
- 形参(parameters):Local variable declared inside the function parameter list. they are initialized by the arguments provided in the each function call.
- 实参 (Arguments): Values supplied in a function call that are used to initialize the function’s parameters.
- 函数的返回类型:大多数类型都可以,
void
表示不返回任何值; 返回类型不能是数组,但可以是指向数组和函数的指针;
注:函数体必须由
{}
包含;
1.1 局部对象
- 局部变量:形参和函数体内定义的变量统称为局部变量,且尽在作用域内可见,并且屏蔽外部同名变量;
- 自动对象:只存在于块执行期间的对象;
- 局部静态对象:其生命周期贯穿函数调用及其后,直至程序结束;定义方式:
static int x = 0;
.
1.2 函数声明
- 函数声明必须在定义之前,函数只能定义一次,但可以声明多次; 函数声明不包含函数体,也不必须指定形参名;
- 函数声明也称作函数原型(prototype)
- 建议在头文件中函数声明,在源文件中函数定义;
2. 参数传递
- 当形参为引用类型时, 相应实参被引用传递,即形参为实参的别名,实体时一致的;
- 当形参为非引用类型时,实参被值传递,即实参的值被拷贝给形参;
- 指针形参:拷贝的是指针的值,同样可以用于改变指向的外部对象,在C语言中多采用它,在C++中建议使用引用形参;
2.2 传引用参数
void reset(int &j)
{
j = 0;
}
//调用:
reset(j);
- 调用时,直接传入对象,而无须传入地址;
- 对于较大的对象,可以避免拷贝;
- 若无需改变对象的值,则形参最好声明为常量引用;
2.3 const形参和实参
- 若形参是顶层const时,传给他常量或非常亮都是可以的;
- 可以用非常量来初始化一个底层const(常量引用是底层的),但反过来不行,即非常量引用形参,不能接受const对象、字面值、和需要类型转换的对象,因此建议形参使用常量引用;
2.4 数组形参
- 两点性质:不允许拷贝数组,数组通常转换成指针
void print(const int *arr)
void print(const int arr[])
void print(cosnt int arr[10])
//三者是等价的,数组的尺寸信息均为传给函数
- 使用标记指定数组长度:适用于C风格字符串;
- 使用标准库规范:
void print(const int *begin, const int *end)
...
//call
print(begin(arr), end(arr))
- 显示传递数组的大小
- 数组引用形参:
void print(int (&arr)[10]) //括号不能少
2.5 main:处理命令行
int main(int argc, char *argv[])
int main(int argc, char **argv)
//第一个参数表示字符串的数目, 第二个参数表示字符串数组
- 运行方式:
XXX.exe arg1 arg2
2.6 可变形参
- initializer_list:适用于实参数目未知,但是其类型一致;
- 传递值序列时,必须将序列放在一对花括号内;