前端学C++

131 阅读2分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

函数指针

函数指针顾名思义,是指向函数的指针。它的定义很简单,基本把函数在文件头部的声明改改就行:

int func(int)  \\ 函数声明
int (*funcPtr)(int)   \\ 函数指针初始化
funcPtr = func  \\ 函数指针指向func

函数指针也蕴含一些技巧():

const double * f1(const double ar[], int n); 
const double * f2(const double [], int); 
const double * f3(const double *, int);

上面的三个函数的函数签名声明其实是一样的,如果想要让某个函数指针指向特定的一个函数,那么可以采取将函指针去替换函数定义的方法,如下:

const double * (*p1)(const double *, int) = f1; \\ 初始化一个指向f1的函数指针p1
auto p2 = f2; \\ 这样也可以

此处又再一次体现出了auto的优越性。

函数指针的意义和用法还有很多未能覆盖到,需要日后补充。

函数传值

传值还是传引用在任何语言中都是重要的,在C++中,函数传参有三种形式:

  • 传值
  • 传引用
  • 传指针 对于经典的两数交换问题,三种策略的代码如下
void swapr(int & a, int & b) // 传引用
{ 
    int temp; 
    temp = a; 
    a = b; 
    b = temp; 
} 
void swapp(int * p, int * q) // 传指针
{ 
    int temp; 
    temp = *p;  
    *p = *q; 
    *q = temp; 
} 
void swapv(int a, int b) // 传值
{ 
    int temp; 
    temp = a; 
    a = b; 
    b = temp; 
}

传引用和传指针两种做法,都是可以达成交换两数的目的的,而由于函数作用域的特性,传值的做法并不会对原本的变量发生作用,而是传指针和传引用两者除了在声明和取变量以外基本是一样的。

对于传引用的函数而言,还有个特性,比方说你有个传引用的函数:

void refFunc(int &r)

如果你这样调用它

int x = 5;
refFunc(x+3)

这种方法对于一般传值函数,结果很好预见,但对于传引用函数来说,这种操作会被大多数编译器否决,而在早期的编译器中,会报出警告,实际的编译操作中,创造了一个值为x+3的变量,然后将指向原来变量的指针指向这个变量了(其实是有点不可控的做法)。