C++程序设计语言之函数小结

一、函数的声明

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++程序设计语言》






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值