在 C++ 中可以在函数声明时为参数提供一个默认值,当函数调用时没有提供参数的值时,则使用默认值。函数的默认值必须在函数声明中指定,那么在函数定义中是否可以出现参数的默认值呢当函数声明和定义中的参数默认值不同时会发生什么呢?我们通过实例代码进行分析
#include <stdio.h> int mul(int x = 0); int main(int argc, char *argv[]) { printf("mul() = %d\n", mul()); printf("mul(-1) = %d\n", mul(-1)); printf("mul(2) = %d\n", mul(2)); return 0; } int mul(int x) { return x * x; }
我们看到在声明函数 mul 时,我们将参数默认声明为 0,我们来看看这个程序可以编译成功吗?如果可以,在 main 函数中会打印出什么?
我们发现它没有报错,也就是说在 C++ 中支持在函数声明时,支持参数默认值。那我们试试在 C 语言比那一起中是否也支持这样的写法呢?
我们看到这样的写法在 C 语言的编译器中是不支持的,那么我们试试在定义中给默认值,声明中不给呢,看 g++ 编译器是否支持
我们看到它报错了,所以只能在声明时给参数默认值。
那么函数既然支持参数默认值,那它在多个参数设置时有没有规则呢?有两条规则:a> 参数的默认值必须从右向左提供;b> 函数调用时使用了默认值,则后续参数必须使用默认值。
我们以代码为例进行分析
#include <stdio.h> int add(int x, int y = 1, int z = 2); int main(int argc, char *argv[]) { printf("add(1) = %d\n", add(1)); // 4 printf("add(1, 2) = %d\n", add(1, 2)); // 5 printf("add(1, 2, 3) = %d\n", add(1, 2, 3));// 6 return 0; } int add(int x, int y, int z) { return x + y + z; }
我们分析下这个代码,默认参数 y 和 z 的值分别为 1 和 2。那么 main 函数中的返回值分别为 1 + 1 + 2 = 4; 1 + 2 + 2 = 5; 1 + 2 + 3 = 6;我们来看看结果是否如此呢?
我们看到结果确实是如我们所分析的那样。那么我们试试只给 y 默认值,也就是说不遵循从右向左分配,看看会编译成功吗?
我们看到编译报错了,那么如果只想给 y 默认值该怎么做呢?只需把 y 和 z 的位置换下就行,将它放在最右边。
下来我们来说说函数占位参数,在 C++ 中可以为函数提供占位参数。占位参数只有参数类型声明,而没有参数名声明;在一般情况下,在函数体内部无法使用占位参数。
我们以代码为例,看看函数占位参数是什么样的
#include <stdio.h> int func(int x, int); int main(int argc, char *argv[]) { printf("func(1, 2) = %d\n", func(1, 2)); return 0; } int func(int x, int) { return x; }
我们试试能否编译通过呢
我们看到编译是通过的,那么我们是不是觉得这是多此一举呢?明明只是个需要一个参数,却多了一个占位参数。下来我们就来讲下函数占位参数的意义,占位参数与默认参数结合起来使用,兼容 C 语言程序中可能出现的不规范写法。我们还记得之前那么 void func() 和 void func(void) 等价这个问题嘛,在 C 语言中它是不等价的,因为第一个是代表可接受任意多的参数,而后一个是不接受参数。而在 C++ 中它们两个表达的意思是一样的。
通过对函数占位参数的 学习,总结如下:1、C++ 中支持参数的默认值;2、如果函数调用时没有提供参数值,则使用默认值;3、参数的默认值必须从右向左提供;4、函数调用时使用了默认值,则后续参数必须使用默认值;5、C++ 中支持占位参数,用于兼容 C 语言中的不规范写法。
欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。
原文地址:http://blog.51cto.com/12810168/2113204