函数-C++的编程模块
函数参数和按值传递
用于接收传递值的变量称为形参,传递的值称为实参
C++标准中,用参数表示实参,用参量表示形参
在函数中的声明的变量是该函数私有的。在函数被调用时,计算机为这些变量分配内存,函数结束调用时,释放这些变量使用的内存。(函数中的变量也是在栈内存中)
函数和数组
在声明函数时 int *arr 和 int arr[] 同等效果,但是在其他情况下,int *arr 换 int arr[] 不同
详情p176
这样做可以减小计算机内存的开销,但是传入数组是原来的数组,这可能会导致原来的数据被破坏,对此,可以使用const限定符。
例如:
int function(const int *arr,int arr_size);
指针和const
int age = 39;
const int * pt = &age;
该声明表示pt指向了一个const int ,因此不能通过pt来修改age,但是可以修改pt,不能将const int的变量赋值给非const int类型的指针(如果非要这样做,可以使用强制类型转换)。
const int **pp2;
int *p1;
const int n = 13;
pp2 = &p1;
*pp2 = &n;
*p1 = 10;
pp2指向一个指向const int的指针,因此将&p1赋值给pp2是可以的(因为p1可以指向const int,个人理解)。但是不能这么做。。。编译器会报错
不能将const int类型的数组或者变量传递到非const的函数中
int age = 39;
const int *pt = &age;
int *const finger = &age;
两者不一样,前者表示指向const int的指针,后者表示 const的指针指向int.
函数和二维数组
int data[3][4] = {...};
...
int sum(int (*ar2)[4],int size); //用于接受 data
int sum(int ar2[][4],int size); //同样用于接受 data
...
int sum(int *ar2[4],int size); //不能接受 data
int *ar2[4]表示四个指向int的指针,int (*ar2)[4]表示指向 int[4]的指针
函数和C-风格字符串
略
函数和结构
结构可以如同普通变量一样赋值,结构的名字只是结构的名称,如果要获得结构的地址,同样需要使用&符号。
结构可以像变量一样在函数中传递值,但是如果结构非常大,赋值结构将增加内存要求(最初C语言不允许按值传递结构),很多程序员(C)倾向于使用地址传值
在C++中,有第三种选择——引用
函数和string对象
可以将一个结构赋值给另一个结构,也可以将一个对象赋值给另一个对象。可以将结构作为完整的实体传给函数,也可以将对象作为完整的实体进行传递。
递归
C++函数可以自己调用自己(与c语言不同的是,C++不允许main()函数调用自己),这种功能称为递归。
void recurs(argumentlist){
statements1
if(test)
recurs(arguments)
statements2
}
函数指针
1. 获取函数的地址
只需要使用函数名(后面不跟参数)即可。如果think()是一个函数,
那么think就是该函数的地址(和python有点类似)
2. 声明函数指针
声明指向函数的指针时,必须指定指针指向的函数原型。
double pam(int); //函数原型
double (*pf)(int); //pf即函数指针,*pf是指针指向的函数
pf = pam;//赋值
int age = 23;
cout << pf(age) << (*pf)(age); //两种方式均可
使用(*pf)(age)可以直观的提示代码正在使用函数指针
auto是一个好东西
如果三个函数f1,f2,f3声明相同可以:
const double * (*pa[3])(const double *, int) = {f1,f2,f3}
因为[]的优先级高于*,所以*pa[3]表名pa是一个包含三个指针的数组。
auto 只能用于单值初始化,不能用于初始化列表。
auto pd = &pa;
const double *(*(*pd)[3])(const double *, int) = &pa;
这两种声明相同效果,显然第二种更繁琐。
typedef
typedef const double *(*p_fun)(const double *, int);
p_fun p1 = f1;
p_fun pa[3] = {f1,f2,f3};
p_fun (*pd)[3] = &pa;
使用typedef可以减少输入量,减少出错率。