一、函数的声明
void print(void): //这是一个简单的函数声明,返回值为空,参数为空。
二、函数的定义
函数的定义,既函数的声明后接有函数体,函数只能定义一次。
int print(int i) { cout << i << endl;} //函数的声明与定义。
三、静态变量
在函数中定义一个静态变量,这个变量只被初始化一次。每次使用这个静态变量的值是上一次的值,该静态变量与函数本身无关,不依赖于函数而存在,只是作用域为这个函数的作用域。静态变量存放在静态存储区中。
void f() {
static int count = 0;
cout++; //每次递增
}
四、函数的重载
c++支持函数的重载,重载是函数名相同,参数类型或者参数个数不同。与函数的返回类型无关。
int f(int);
int f(double);
int f(char);
double f(int); //错误,不能用返回值类型不同来体现函数的重载
函数的调用过程中会寻找最匹配的函数。最匹配的函数需要符合下面几个规则。
【1】准确匹配;无须任何转换或者只须做平凡转换(例如,数组名到指针的转换,函数到函数指针的转换,T到const T等)的匹配。
【2】利用提升的匹配;包括整数提升(bool 到 int, char 到 int, short 到 int 以及它们的无符号版本)以及float到double的提升。
【3】利用标准转换 例如(int 到 double ,double 到 int)。
【4】利用用户定义转换。
【5】利用函数声明中的省略号...。
如果不存在匹配的最好的函数,就会报出一个编译错误。
void print(double);
void print(long);
void f() {
print(1L);
print(1.0);
print(1); //存在歧义。
}
五、函数的参数
函数的参数的传递语义与初始化的语义完全相同。如果参数是一个对象,确定不改变这个参数的内容,应该将参数声明为const T&。这样能够告诉读者,该函数的调用不会改变参数的内容,只是为了提高函数的效率。如果在一个引用参数的声明中没有const,就应该认为,该参数将被修改。
文字量、常量和需要转换的参数都可以传递给const& 参数,但不能传递给非const的引用参数。对非const引用参数不允许做类型转换,这种规定能帮助我们避免了一种由于临时变量而产生的可笑错误。
void update(float& i);
void g(double d, float r) {
update(2.0f); //错误:const参数
update(d); //错误:要求类型转换。
update(r);
}
默认的参数值:参数可以设置默认的参数值,例如:
void f(int i, double d = 0.0) ;
void g() {
f(3); //正确第二个参数使用默认值。
f(3,4.0);
}
void k(int i=3, double d); //错误参数默认值只能对排列在最后的那些参数提供默认参数。
void f(int data[],int size);
六、指向函数的指针
对于一个函数只能做两件事:调用它,或者取得它的地址。函数指针的声明以及使用实例:
typedef void (*PF)();
void f();
void g() {
PF mf1 = &f;
PF mf2 = f; //与上面的相同,可以不写取得函数的地址的&
(*mf1)();
mf2(); //与上面的相同,可以不用写*。
}
参考书籍《C++程序设计语言》