C++ 函数

来源:互联网 发布:淘宝节点处罚考试答案 编辑:程序博客网 时间:2024/05/19 00:43

C++函数不能直接返回数组,但可以将数组作为结构体或对象的组成部分来返回。

传递一维数组

// 如果需要修改数组void f_modify(double ar[], int n);// 如果不修改数组void f_no_change(const double ar[], int n);

在函数中,无法使用sizeof运算符来获取一个数组参数的长度,必须依赖程序员传来的长度。

传递二维数组

int sum(int (*arr)[4], int size);int sum(int arr[][4], int size);

传递C风格字符串

因为字符串以’\0’结尾,所以不用传递字符串的长度。

传递对象和结构

  1. 按值传递(不修改原始内容)
  2. 传递地址(修改原始内容)
  3. 按引用传递(修改原始内容)

函数指针

函数的地址是存储其机器语言代码的内存的开始地址。
1、 获取函数地址
函数的地址就是函数名(不加参数列表和括号)
2、 声明函数指针
应制定函数的返回类型和函数的特征标(参数列表)
double pam(int); // 原型
正确的声明方式为:
double (*pf)(int);
3、 使用指针调用函数

double pam(int);double (*pf)(int);pf = pam;double x = pam(4);double y = (*pf)(5);

内联函数

用inline修饰的函数,内联函数的编译代码与其他代码“内联”起来,编译器将使用相应的函数代码来替换常规的函数调用,也将是说有多少次函数调用,该函数的编译代码就有多少副本。另外内联函数无法递归。

默认参数

有默认值得参数一定要在没默认值参数的右边。

函数模板

template <typename AnyType>void Swap(AnyType &a, AnyType &b){    AnyType temp;    temp = a;    a = b;    b = temp;}template <class AnyType>void Swap(AnyType &a, AnyType &b){    AnyType temp;    temp = a;    a = b;    b = temp;}

模板可重载

显示具体化

  • 对于给定的函数名,可以有非模板函数、模板函数和显示具体化模板函数以及他们的重载版本
  • 显示具体化的原型和定义应以template<>开头,并通过名称来指出类型
  • 非模板优于具体化,具体化优于常规模板
// job为一个结构体// 非模板函数void Swap(job &a, job &b);// 常规模板函数template <typename T>void Swap(T &a, T &b);// 具体化模板template <> void Swap<job>(job &a, job &b);

显示实例化与隐式实例化

编译器使用模板来生成函数实例的是隐式实例化,使用显示实例化模板来实例化是显示实例化,需要用<>来指定类型
template <> void Swap(int &a, int &b); // 注意与显示具体化的区别

原创粉丝点击