C++ Primer知识系列三:函数
格式:函数返回值类型 函数名(参数列表){……}
1、参数
//1. 数组参数,传递的是地址
int func1(int arr[],int n)
int func2(int* arr,int n)
int func3(const int arr[],int n)//const原始数组不被修改
//二维数组
int func4(int* arr[4],int m)
int func5(int arr[][4],int m)
//2. C-风格字符串参数
int func6(const char* s或const char s[])
char* func7(char ch,int n){
char* p = new char[n+1];
p[n] = '\0';
while (n--) p[n]=ch;
return p;
}//返回C-风格字符串
char* res = func7('c',5);
delete[] res;
//3. 结构参数
//可以按值传递
struct structExam{...};
void func8(structExam t1)
//与数组类似,可以传递地址(取地址:&结构名)
void func8(const structExam* t1)
func8(&t);
2. 函数指针
函数地址:存储其机器代码的内存的开始地址,函数名就是函数地址。
声明函数指针:返回类型 (*函数指针名) (参数列表);
使用指针调用函数: (*函数指针名)(…);
指向函数指针的指针:
typedef int (*p_fun)(...);
int f1(...);
p_fun p1 = f1;//f1是函数指针,p1是指向函数指针的指针
3. 内联函数
在函数声明和定义前加关键字inline,内联函数用内联代码代替函数调用,运行速度快但占用内存多,但不能递归且编译器不一定会满足内联函数要求。
4. 引用变量
引用是变量别名,用作函数形参,函数可使用原始数据。
类型& 引用名=变量名;必须在声明时初始化。
注意:应避免返回函数终止时不再存在的内存单元的引用。
5. 函数重载
名称相同但函数特征标(参数列表)不同的函数。
类型自身与其引用视为相同的特征标。
6. 函数模板
//多种类型使用同一函数,但并非所有参数必须为模板类型
template <class T>
void func(T a,T b){...}
//显示具体化,优先级:非模板函数>具体化>常规模板
template<> 常规函数......
//显示实例化
template void func2<int>(...){...}