第 七 章 函 数
1 静态变量:
局部变量将在运行线程达到其定义时进行初始化,如果有一个局部变量被声明为static,则只有唯一的一个静态对象用来表达该函数所有调用中的这个对象。(即:在调用static型的变量时只会存在一个该变量的副本,所以在此函数中改变了这个变量的话,那么在其他函数中的这个变量就同时的改变了),静态对象将只有在执行线程第一次到达它时初始化。
2 未确定数目的函数的参数:
对有些函数而言,若我们没有办法确定其参数,则可以在参数表后用省略号(…)来结束,如:
int printf (const char *p, …); ////在stdio.h头文件里
但一个良好的程序应该尽量避免用未确定数目的函数的参数,而应该用重载来考虑所有可能的情况。
(我不明白怎么用自己定义的未确定参数数目的函数:有哪位能告诉我好吗?mailto:youki1234@163.com
3 指向函数的指针:
定义:通过取一个函数的地址而得到的指针。作用:可以在后面用于调用这个函数,如:
void error (int s)
{
printf(“%d” ,s );
}
void (*f) (int)=&error;;////定义一个指向一个参数类型为int,返回值类型为void的函数的指针,并把它指向error函数。
void g( )
{
f( ); //通过f()调用error函数;
}
在写法上,由于编译器知道f是一个指针,所以可以不写指针符:*,同理也可以不写取地址符:&;即:
void (*f)(int)=&error; 与
void (*f)(int)=error; 完全等价。
注意:在指向函数的指针声明中也需要给出参数类型,在给函数的指针赋值时也必须注意类型需要完全匹配。
4 宏:
宏在c++中不应该被使用。
宏的名字不能被重载,而且宏预处理器不能处理递归调用;
注意:
在引用全局名字时一定要用作用域运算符 ::,而且在所以可能出现宏的参数的地方用括号括起来,原因:
以下是一个危险的宏:
#define square(a) a*a;
void f()
{
square(xx+2); //被解释成: xx+2*xx+2即:xx+(2*xx)+2
}